Analizza file JSON usando GSON

Voglio analizzare questo file JSON in JAVA usando 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"] } } } 

ma non so come accedere all’elemento radice che è: descrittore , dopo l’elemento app3 e infine l’elemento nome .

Ho seguito questo tutorial http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/ , ma non mostra il caso di avere elementi root e childs.

Imo, il modo migliore per analizzare la tua risposta JSON con GSON è la creazione di classi che “corrispondono” alla tua risposta e quindi utilizzano il metodo Gson.fromJson() .
Per esempio:

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

Quindi usa solo:

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

Dove yourJson può essere una String , qualsiasi Reader , JsonReader o JsonElement .

Infine, se vuoi accedere ad un campo particolare, devi solo fare:

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

È sempre ansible analizzare manualmente il JSON come suggerito in altre risposte, ma personalmente ritengo che questo approccio sia più chiaro, più gestibile a lungo termine e si adatti meglio all’intera idea di JSON.

Sto usando 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(); } } 

Una cosa da ricordare durante la risoluzione di tali problemi è che nel file JSON, un { indica un object JSONObject e un [ indica JSONArray . Se si riuscisse a gestirli correttamente, sarebbe molto semplice eseguire l’operazione di analisi del file JSON. Il codice sopra è stato davvero molto utile per me e spero che questo contenuto aggiunga un significato al codice sopra.

La documentazione di Gson JsonReader spiega come gestire l’analisi di JsonObjects e JsonArrays :

  • All’interno dei metodi di gestione dell’array, prima chiamare beginArray () per consumare la parentesi di apertura dell’array. Quindi creare un ciclo while che accumula valori, terminando quando hasNext () è falso. Infine, leggi la parentesi di chiusura dell’array chiamando endArray ().
  • All’interno dei metodi di gestione degli oggetti, prima chiama beginObject () per consumare la parentesi di apertura dell’object. Quindi creare un ciclo while che assegni valori alle variabili locali in base al loro nome. Questo ciclo dovrebbe terminare quando hasNext () è falso. Infine, leggi la parentesi di chiusura dell’object chiamando endObject ().