2013-05-04 22 views
29

voglio analizzare questo file di JSON in JAVA utilizzando GSON:file di Parse JSON utilizzando 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 io non so come acceed per l'elemento principale che è: descrittore, successivamente 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 di root e childs.

+0

Ecco un esempio http://thegeekyland.blogspot.com/2015/11/serializing-and-deserializing-json-from.html – Arlind

risposta

46

Imo, il modo migliore per analizzare la vostra risposta JSON con GSON sarebbe la creazione di classi che "match" la risposta e quindi utilizzare Gson.fromJson() metodo.
Ad esempio:

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

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

Poi basta usare:

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

Dove yourJson possono essere un String, qualsiasi Reader, un JsonReader o un JsonElement.

Infine, se si desidera accedere a qualsiasi settore particolare, devi solo fare:

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

È sempre possibile analizzare il JSON manualmente come suggerito in altre risposte, ma personalmente penso che questo approccio è più chiaro, più manutenibile a lungo termine e si adatta meglio con l'intera idea di JSON.

+1

Credo che questo catturi lo spirito di JSON molto meglio di un approccio "parser manuale" – tucuxi

+0

Grazie, ma il file JSON non conterrà solo app1, app2, app3, sarà dinamico, quindi non sarò in grado di risolvere il problema attributi di classe .. – Copernic

+0

@Mehdi visualizza il codice modificato, che è ancora più semplice e ti permette di avere un numero arbitrario di oggetti * app * nella tua risposta JSON, semplicemente cambiando il tipe per una 'Mappa' ... Btw, se tu ' Avremo un numero arbitrario di oggetti app, dovresti dirlo nel tuo post originale! ;) – MikO

15

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(); 
} 
} 
+0

Grazie :) ma perché dobbiamo impostare 'jsonReader.beginObject();' e 'jsonReader.endObject();' in ogni metodo? (main e readApp) Grazie :) – Copernic

+0

Capisco, grazie Gere. – Copernic

+0

Sono d'accordo con miko. GSON è una libreria molto potente per convertire oggetti JSON-Java e viceversa .. L'ho usata in questo modo nella maggior parte dei progetti. – Gere

2

Una cosa che deve essere ricordata mentre risolvere tali problemi è che in un file JSON, un { indica una 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.

Il Gson JsonReader documentation spiega come gestire parsing di JsonObjects e JsonArrays:

  • Da metodi manipolazione di matrice, prima chiamata beginArray() per consumare parentesi di apertura della matrice. 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 chiamare beginObject() per consumare la parentesi di apertura dell'oggetto. 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'oggetto chiamando endObject().