2013-05-04 28 views
29

ich diese JSON Datei in JAVA mit Gson analysieren möchten:Parse JSON-Datei mit Gson

{ 
    "descriptor" : { 
     "app1" : { 
      "name" : "mehdi", 
      "age" : 21, 
      "messages": ["msg 1","msg 2","msg 3"] 
     }, 
     "app2" : { 
      "name" : "mkyong", 
      "age" : 29, 
      "messages": ["msg 11","msg 22","msg 33"] 
     }, 
     "app3" : { 
      "name" : "amine", 
      "age" : 23, 
      "messages": ["msg 111","msg 222","msg 333"] 
     } 
    } 
} 

aber ich weiß nicht, wie man das Wurzelelement Modus zu gelangen, das ist: Descriptor, danach das app3 Element und schließlich das Name Element.

Ich folgte diesem Tutorial http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/, aber es zeigt nicht den Fall eines Stamm-und Childs-Elemente.

+0

Hier ist ein Beispiel http://thegeekyland.blogspot.com/2015/11/serializing-and-deserializing-json-from.html – Arlind

Antwort

46

Imo, den besten Weg, um Ihre JSON-Antwort mit Gson zu analysieren würde, dass „Übereinstimmung“ Ihre Antwort und dann Gson.fromJson() Methode verwenden Erstellen von Klassen werden.
Zum Beispiel:

class Response { 
    Map<String, App> descriptor; 
    // standard getters & setters... 
} 

class App { 
    String name; 
    int age; 
    String[] messages; 
    // standard getters & setters... 
} 

Dann benutzen Sie einfach:

Gson gson = new Gson(); 
Response response = gson.fromJson(yourJson, Response.class); 

Wo yourJson ein String sein kann, jede Reader, ein JsonReader oder ein JsonElement.

Schließlich, wenn Sie einen bestimmten Bereich zugreifen möchten, müssen Sie nur tun:

String name = response.getDescriptor().get("app3").getName(); 

Sie können die JSON immer manuell analysieren, wie in anderen Antworten vorgeschlagen, aber ich persönlich denke, dieser Ansatz ist klarer, auf lange Sicht haltbarer und es passt besser zu der ganzen Idee von JSON.

+1

Ich glaube, dies erfasst den Geist von JSON viel besser als ein "manueller Parser" -Ansatz – tucuxi

+0

Danke, aber die JSON-Datei wird nicht nur app1, app2, app3 enthalten, es wird dynamisch sein, so dass ich nicht in der Lage sein werde, das zu beheben Klassenattribute .. – Copernic

+0

@Mehdi sehen bearbeitetem Code, der noch einfacher ist und Ihnen erlaubt, eine beliebige Anzahl von * app * Objekten in Ihrer JSON-Antwort zu haben, nur die Tipe für eine 'Karte' ändern ... BTW, wenn Sie ' Ich habe eine beliebige Anzahl von App-Objekten, Sie sollten es in Ihrem ursprünglichen Post sagen! ;) – MikO

15

Ich verwende Gson 2.2.3

public class Main { 

/** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 

    JsonReader jsonReader = new JsonReader(new FileReader("jsonFile.json")); 

    jsonReader.beginObject(); 

    while (jsonReader.hasNext()) { 

    String name = jsonReader.nextName(); 
     if (name.equals("descriptor")) { 
      readApp(jsonReader); 

     } 
    } 

    jsonReader.endObject(); 
    jsonReader.close(); 

} 

public static void readApp(JsonReader jsonReader) throws IOException{ 
    jsonReader.beginObject(); 
    while (jsonReader.hasNext()) { 
     String name = jsonReader.nextName(); 
     System.out.println(name); 
     if (name.contains("app")){ 
      jsonReader.beginObject(); 
      while (jsonReader.hasNext()) { 
       String n = jsonReader.nextName(); 
       if (n.equals("name")){ 
        System.out.println(jsonReader.nextString()); 
       } 
       if (n.equals("age")){ 
        System.out.println(jsonReader.nextInt()); 
       } 
       if (n.equals("messages")){ 
        jsonReader.beginArray(); 
        while (jsonReader.hasNext()) { 
          System.out.println(jsonReader.nextString()); 
        } 
        jsonReader.endArray(); 
       } 
      } 
      jsonReader.endObject(); 
     } 

    } 
    jsonReader.endObject(); 
} 
} 
+0

Danke :) aber warum müssen wir 'jsonReader.beginObject();' und 'jsonReader.endObject();' in jeder Methode? (Haupt- und readApp) Danke :) – Copernic

+0

Ich verstehe, danke Gere. – Copernic

+0

Ich stimme Miko zu. GSON ist eine sehr mächtige Bibliothek zum Konvertieren von JSON-Java Object und umgekehrt. Ich habe es in den meisten Projekten so verwendet. – Gere

2

Eine Sache, die in Erinnerung bleiben werden, während solche Probleme zu lösen, besteht darin, dass in JSON-Datei, ein { ein JSONObject anzeigt und ein [ zeigt JSONArray. Wenn man sie richtig verwalten könnte, wäre es sehr einfach, die JSON-Datei zu analysieren. Der obige Code war wirklich sehr hilfreich für mich und ich hoffe, dass dieser Inhalt dem obigen Code eine Bedeutung hinzufügt.

Die Gson JsonReader documentation wird erläutert, wie das Parsen von JsonObjects handhabbar und JsonArrays:

  • innerhalb des Arrays Handhabungsverfahren zunächst nennen beginArray(), um die Anordnung der Öffnungsbügel zu verbrauchen. Erstellen Sie dann eine while-Schleife, die Werte akkumuliert und beendet, wenn hasNext() false ist. Lesen Sie schließlich die schließende Klammer des Arrays, indem Sie endArray() aufrufen.
  • Rufen Sie innerhalb von Objektbehandlungsmethoden zunächst beginObject() auf, um die öffnende Klammer des Objekts zu verwenden. Erstellen Sie anschließend eine while-Schleife, die lokalen Variablen basierend auf ihrem Namen Werte zuweist. Diese Schleife sollte beendet werden, wenn hasNext() false ist. Lesen Sie abschließend die schließende Klammer des Objekts, indem Sie endObject() aufrufen.