it-swarm.com.de

Analysieren Sie die JSON-Datei mit GSON

Ich möchte diese [~ # ~] json [~ # ~] Datei in Java 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 ich zu dem Wurzelelement kommen soll, das ist: Deskriptor , danach die App3 Element und schließlich das Name Element.

Ich habe dieses Tutorial befolgt http://www.mkyong.com/Java/gson-streaming-to-read-and-write-json/ , aber es zeigt nicht, dass es eine Wurzel hat und childs Elemente.

35
user1079425

Imo, die beste Möglichkeit, Ihre JSON-Antwort mit GSON zu analysieren, wäre, Klassen zu erstellen, die Ihrer Antwort "entsprechen" und dann die Methode Gson.fromJson() zu verwenden.
Beispielsweise:

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

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

Dann benutze einfach:

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

Wobei yourJson ein String sein kann, ein Reader , ein JsonReader oder ein JsonElement .

Wenn Sie auf ein bestimmtes Feld zugreifen möchten, müssen Sie nur Folgendes tun:

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

Sie können JSON immer manuell analysieren, wie in anderen Antworten vorgeschlagen, aber ich persönlich halte diesen Ansatz für klarer, auf lange Sicht besser wartbar und passt besser zur gesamten Idee von JSON.

50
MikO

Ich benutze 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();
}
}
20
Gere

Eine Sache, an die man sich beim Lösen solcher Probleme erinnern muss, ist, dass in der JSON-Datei ein { gibt ein JSONObject und ein [ gibt JSONArray an. 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 gewisse Bedeutung verleiht.

Die Gson JsonReader-Dokumentation erklärt, wie mit dem Parsen von JsonObjects und JsonArrays umgegangen wird:

  • Rufen Sie bei Array-Behandlungsmethoden zunächst beginArray () auf, um die öffnende Klammer des Arrays zu verbrauchen. Erstellen Sie dann eine while-Schleife, die Werte ansammelt und endet, wenn hasNext () false ist. Lesen Sie abschließend die schließende Klammer des Arrays, indem Sie endArray () aufrufen.
  • Rufen Sie bei Objektbehandlungsmethoden zunächst beginObject () auf, um die öffnende Klammer des Objekts zu verbrauchen. Erstellen Sie dann eine while-Schleife, die lokalen Variablen anhand ihres Namens Werte zuweist. Diese Schleife sollte enden, wenn hasNext () false ist. Lesen Sie abschließend die schließende Klammer des Objekts, indem Sie endObject () aufrufen.
2