Archivo JSON de Parse con GSON

Quiero analizar este archivo JSON en 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"] } } } 

pero no sé cómo acceder al elemento raíz que es: descriptor , después de eso, el elemento app3 y finalmente el elemento name .

Seguí este tutorial http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/ , pero no muestra el caso de tener elementos raíz y secundarios.

Imo, la mejor manera de analizar su respuesta JSON con GSON sería crear clases que “coincidan” con su respuesta y luego usar el método Gson.fromJson() .
Por ejemplo:

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

Entonces solo usa:

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

Donde yourJson puede ser un String , cualquier Reader , un JsonReader o un JsonElement .

Finalmente, si desea acceder a un campo en particular, solo tiene que hacer:

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

Siempre se puede analizar manualmente el JSON como se sugiere en otras respuestas, pero personalmente creo que este enfoque es más claro, más fácil de mantener a largo plazo y se ajusta mejor a la idea de JSON.

Estoy 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 que debe recordarse al resolver tales problemas es que en el archivo JSON, un { indica un objeto JSONObject y un [ indica JSONArray . Si uno pudiera administrarlos adecuadamente, sería muy fácil realizar la tarea de analizar el archivo JSON. El código anterior fue realmente muy útil para mí y espero que este contenido agregue algún significado al código anterior.

La documentación de Gson JsonReader explica cómo manejar el análisis de JsonObjects y JsonArrays :

  • Dentro de los métodos de manejo de matrices, primero llame a beginArray () para consumir el corchete de apertura de la matriz. Luego crea un ciclo while que acumula valores, que termina cuando hasNext () es falso. Finalmente, lea el paréntesis de cierre de la matriz llamando a endArray ().
  • Dentro de los métodos de manejo de objetos, primero llame a beginObject () para consumir la llave de apertura del objeto. Luego crea un ciclo while que asigna valores a las variables locales en función de su nombre. Este ciclo debe terminar cuando hasNext () es falso. Finalmente, lea la llave de cierre del objeto llamando a endObject ().