2013-05-15 11 views
13

私はJavaでjson-simpleライブラリーを使用するのが初めてで、encodingdecodingサンプルの両方を使っています。エンコーディングの例を複製しても問題ありませんでしたが、デコードされたサンプルを混合型JSONで処理することはできませんでした。JavaでJSONストリングをデコードする

私の問題の1つは、適切に文書化されておらず、ソースを持っていないライブラリがたくさんあることです(その目的を読んで理解するためです)。したがって、私はこれらのクラスを多く使う方法を理解するのに苦労しています。

この例で読んだ後:json-simple official decoding tutorialから

String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}"; 
JSONParser parser = new JSONParser(); 

ContainerFactory containerFactory = new ContainerFactory(){ 
    public List creatArrayContainer() { 
     return new LinkedList(); 
    } 

    public Map createObjectContainer() { 
     return new LinkedHashMap(); 
    }      
}; 

try { 
    Map json = (Map)parser.parse(jsonText, containerFactory); 
    Iterator iter = json.entrySet().iterator(); 
    System.out.println("==iterate result=="); 

    while(iter.hasNext()) { 
     Map.Entry entry = (Map.Entry)iter.next(); 
     System.out.println(entry.getKey() + "=>" + entry.getValue()); 
    } 

    System.out.println("==toJSONString()=="); 
    System.out.println(JSONValue.toJSONString(json)); 
} catch(ParseException pe) { 
    System.out.println(pe); 
} 

を、私はこのJSONをデコードしてみました:

{ 
"stat":{ 
    "sdr": "MAC address of FLYPORT", 
    "rcv": "ff:ff:ff:ff:ff:ff", 
    "time": "0000000000000", 
    "type": 0, 
    "subt": 0, 
    "argv": [ 
     {"type": "6","val": "NetbiosName"}, 
     {"type": "6","val": "MACaddrFlyport"}, 
     {"type": "6","val": "FlyportModel"}, 
     {"type": "1","val": id} 
    ] 
} 
} 

私は、デコードするために、次のコードを書いています:

String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{1,2},{2,3}]}}"; 
    JSONObject jsonObject = new JSONObject(jsonString); 
    JSONObject newJSON = jsonObject.getJSONObject("stat"); 
    System.out.println(newJSON); 

しかし、それは動作しません。実際には、変更されていないサンプルも動作させることができず、元の作者はコードを説明していませんでした。

示されているようにこのJSONをデコードする最も簡単な方法は何ですか?

+0

statをデコードするコードを確認できますか? –

+0

[JSON公式解読チュートリアル](https://code.google.com/p/json-simple/wiki/DecodingExamples)の例5(停止可能なSAXライクなコンテンツハンドラ)で確認しました コードは単一辞書(マップ)/配列を対象としています。しかし、あなたは地図で地図(複数の地図)でjsonを試しています。私が間違っていれば私を修正してください。 – ram2013

+0

@ ram2013:ya ..私が解読する必要があるのはマップの地図です...そして、私はこれがそれらの一つだと思います。私が "stat"の値を得たかのように、私はそれをさらにJSONのデコードに使うことができます。 –

答えて

17

これが最善かつ最も簡単なコードです。そして、それは投稿されたものと同じライブラリではないhere、すなわちあなたによって投稿された。投稿した内容はsimple json libraryでしたthis libraryを使用しました。

download the zipです。あなたのプロジェクトにorg.jsonという名前でpackageを作成します。ダウンロードしたすべてのコードをそこに貼り付けて、楽しくしてください。

私はこれが最高の、最も簡単なJSONデコードであると感じています。

+0

'JSON'でエスケープ' \ 'を' '' 'に追加するにはどうすればいいでしょうか? – Identity1

+0

私はこの出力を得続けます " JSONObjectテキストは '{'で始まる1 [文字2行1]] " 私のJSONコンテンツは2番目の" {"の前に何もありません – Chandough

+0

リンクを更新してくださいその死んだ – muaaz

4

あなたのjsonStringが間違っています。

String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{\"1\":2},{\"2\":3}]}}"; 

使用このjsonString、あなたは一例で同じJSONParserContainerFactoryを使用する場合は、/デコードエンコードされることがわかります。あなたがstat後に文字列を印刷したい場合は

はさらに、ここでそれが行く:

 try{ 
     Map json = (Map)parser.parse(jsonString, containerFactory); 
     Iterator iter = json.entrySet().iterator(); 
     System.out.println("==iterate result=="); 
     Object entry = json.get("stat"); 
     System.out.println(entry); 
     } 

とJSONライブラリについて、それらの多くがあります。より良いあなたはthisをチェックしてください。

public class test 
{ 
    public static void main(String str[]) 
    { 
     String jsonString = "{\"stat\": { \"sdr\": \"aa:bb:cc:dd:ee:ff\", \"rcv\": \"aa:bb:cc:dd:ee:ff\", \"time\": \"UTC in millis\", \"type\": 1, \"subt\": 1, \"argv\": [{\"type\": 1, \"val\":\"stackoverflow\"}]}}"; 
     JSONObject jsonObject = new JSONObject(jsonString); 
     JSONObject newJSON = jsonObject.getJSONObject("stat"); 
     System.out.println(newJSON.toString()); 
     jsonObject = new JSONObject(newJSON.toString()); 
     System.out.println(jsonObject.getString("rcv")); 
     System.out.println(jsonObject.getJSONArray("argv")); 
    } 
} 

library definition of the json files are given here

+0

リンクが死んでいます... –

2

これは、私たちが解読したいJSON文字列です:

{ 
    "stats": { 
     "sdr": "aa:bb:cc:dd:ee:ff", 
     "rcv": "aa:bb:cc:dd:ee:ff", 
     "time": "UTC in millis", 
     "type": 1, 
     "subt": 1, 
     "argv": [ 
      {"1": 2}, 
      {"2": 3} 
     ]} 
} 

私は今、これはそれをデコードする方法です:)

// Creating a JSONObject from a String 
JSONObject nodeRoot = new JSONObject(sJSON); 

// Creating a sub-JSONObject from another JSONObject 
JSONObject nodeStats = nodeRoot.getJSONObject("stats"); 

// Getting the value of a attribute in a JSONObject 
String sSDR = nodeStats.getString("sdr"); 
+1

Letter 'sにはaがありません。 t "stat"はJSONObjectでなければなりません。nodeStats = nodeRoot.getJSONObject( "stats");右 ? –

3

変数名 "sJSON" の下で、この文字列を格納Veerの提案にしたがって個別のJavaファイルをダウンロードするのではなく、JAR fileをパッケージに追加するだけです。

次の手順を実行し、Eclipseでプロジェクトにjarファイルを追加するには:

  1. 右の設定がパス
  2. 後藤ライブラリ]タブを構築>、プロジェクトをクリックしてパスをビルド]をクリックします> [外部JAR
  3. を追加します。
  4. JARファイルを検索して追加する