2013-05-15 33 views
13

Ich bin neu in der Verwendung der json-Simple-Bibliothek in Java und habe sowohl die encoding als auch die decoding-Beispiele durchlaufen. Duplizieren der Codierungsbeispiele war in Ordnung, aber ich konnte die Decodierung nicht mit JSON vom gemischten Typ arbeiten.JSON-String in Java entschlüsseln

Eines meiner Probleme ist, dass es zu viele Klassen in der Bibliothek gibt, die nicht richtig dokumentiert sind und für die ich nicht die Quelle habe (um ihren Zweck lesen und verstehen zu können). Folglich habe ich Schwierigkeiten zu verstehen, wie man viele dieser Klassen benutzt.

Nach der Lektüre dieses Beispiel:

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); 
} 

vom json-simple official decoding tutorial habe ich versucht, diese JSON zu entschlüsseln:

{ 
"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} 
    ] 
} 
} 

Ich schreibe Code folgt zu entschlüsseln:

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); 

Aber es funktioniert nicht. Tatsächlich konnte ich das unmodifizierte Beispiel auch nicht ausführen, und die ursprünglichen Autoren haben ihren Code nicht erklärt.

Was ist der einfachste Weg, diesen JSON wie gezeigt zu dekodieren?

+0

Können wir Ihren Code zum Entschlüsseln eines Stat sehen? –

+0

Haben Sie in [JSON-Tutorial für offizielle Dekodierung] (https://code.google.com/p/json-simple/wiki/DecodingExamples) unter Beispiel 5 (Stoppable SAX-ähnlicher Inhaltshandler) nachgesehen. Wie ich das sehen kann Der Code ist für einzelnes Wörterbuch (Map)/Array vorgesehen. Aber Sie versuchen für den JSON mit Karten in einer Karte (mehrere Karten). Wenn ich falsch liege, korrigiere mich. – ram2013

+0

@ ram2013: ya .. mein was ich entschlüsseln muss ist Karten in Karten ... und ich denke, das ist einer von ihnen. als ob ich den Wert für "stat" bekomme kann ich es für weitere JSON Decodierung verwenden. –

Antwort

17

Dies ist die beste und einfachste Code:

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")); 
    } 
} 

Die library definition of the json files are given here. Und es ist nicht die gleichen Bibliotheken wie gepostet here, d. H. Von Ihnen gepostet. Was du gepostet hast, war simple json library Ich habe this library verwendet.

Sie können download the zip. Und dann erstellen Sie eine package in Ihrem Projekt mit org.json als Name. und fügen Sie alle heruntergeladenen Codes dort ein und haben Sie Spaß.

Ich fühle, dass dies die beste und einfachste JSON-Decodierung sein.

+0

Wie fügen wir das Escape '\' zu '' 'in' JSON' hinzu? Ich möchte nicht eine 'String.replace()' – Identity1

+0

Ich bekomme diese Ausgabe " Ein JSONObject-Text muss mit '{' bei 1 beginnen [Zeichen 2 Zeile 1] "" Mein JSON-Inhalt hat nichts vor dem zweiten "{" – Chandough

+0

Bitte aktualisieren Sie den Link. Sein tot – muaaz

4

Nun, Ihre jsonString ist falsch.

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}]}}"; 

Verwendung dieses jsonString und wenn Sie die gleiche JSONParser und ContainerFactory im Beispiel verwenden, werden Sie sehen, dass es verschlüsselt wird/decodiert.

Zusätzlich, wenn Sie Ihre Zeichenfolge drucken möchten nach stat hier geht es:

 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); 
     } 

Und über die json Bibliotheken, es gibt eine Menge von ihnen. Besser überprüfen Sie this.

+0

Verbindung ist tot ... –

2

Dies ist die JSON String wir entschlüsseln wollen:

{ 
    "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} 
     ]} 
} 

Ich speichere diese Zeichenfolge unter dem Variablennamen "sJSON" Nun, dies ist, wie es zu entschlüsseln :)

// 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

Brief 's' fehlt a t "stat", sollte JSONObject sein nodeStats = nodeRoot.getJSONObject ("stats"); Recht ? –

3

Anstatt separate Java-Dateien herunterzuladen, wie von Veer vorgeschlagen, können Sie einfach dieses JAR file zu Ihrem Paket hinzufügen.

Um die JAR-Datei zu einem Projekt in Eclipse, gehen Sie wie folgt hinzu:

  1. Rechtsklick auf das Projekt, klicken Sie auf Build Path> Konfigurieren Pfad
  2. Registerkarte Goto Bibliotheken Erstellen> Add External JARs
  3. Suchen Sie die JAR-Datei und fügen Sie
  4. hinzu
Verwandte Themen