2013-05-04 17 views
29

Chcę przeanalizować ten JSON plik w JAVA użyciu GSON:Parse plik JSON za pomocą 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"] 
     } 
    } 
} 

ale nie wiem jak acceed do elementu głównego, który jest: deskryptor, potem element app3 i na koniec element nazwa.

Śledziłem ten samouczek: http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/, ale nie pokazano przypadku posiadania elementu głównego i elementów potomnych.

+0

Oto przykład http://thegeekyland.blogspot.com/2015/11/serializing-and-deserializing-json-from.html – Arlind

Odpowiedz

46

Imo, najlepszym sposobem, aby analizować swoją odpowiedź JSON z GSON byłoby tworzenie klas, że „mecz” swoją odpowiedź, a następnie użyć Gson.fromJson() metody.
Na przykład:

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

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

Następnie wystarczy użyć:

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

Gdzie yourJson może być String każdy Reader, A JsonReader lub JsonElement.

Wreszcie, jeśli chcesz uzyskać dostęp do określonej dziedzinie, po prostu trzeba zrobić:

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

Zawsze można analizować JSON ręcznie jak sugerowano w innych odpowiedzi, ale osobiście myślę, że to podejście jest jaśniejsze, bardziej dający się utrzymać w dłuższej perspektywie i lepiej pasuje do idei JSON.

+1

Wierzę, że to oddaje ducha JSON znacznie lepiej niż podejście "ręcznego analizatora składni" – tucuxi

+0

Dziękuję, ale plik JSON nie będzie zawierał tylko aplikacji 1, aplikacji2, aplikacji3, będzie dynamiczny, więc nie będę w stanie naprawić atrybuty klas .. – Copernic

+0

@Mehdi zobacz edytowany kod, który jest jeszcze prostszy i pozwala ci mieć dowolną liczbę obiektów * app * w odpowiedzi na JSON, po prostu zmieniając tipe dla 'Map' ... Btw, jeśli" Będą mieć dowolną liczbę obiektów aplikacji, powinieneś powiedzieć to w oryginalnym poście! ;) – MikO

15

Używam 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

Dziękuję :), ale dlaczego musimy ustawić 'jsonReader.beginObject();' i 'jsonReader.endObject();' w każdej metodzie? (główne i readApp) Dziękuję :) – Copernic

+0

Rozumiem, dziękuję, Gere. – Copernic

+0

Zgadzam się z miko. GSON jest bardzo potężną biblioteką do konwersji JSON-Java Object i viceversa .. Używałem go w ten sposób w większości projektów. – Gere

2

Jedną rzeczą, która należy pamiętać podczas rozwiązywania takich problemów jest to, że w pliku JSON, A { wskazuje JSONObject i [ wskazuje JSONArray. Jeśli uda się im odpowiednio zarządzać, bardzo łatwo będzie wykonać parsowanie pliku JSON. Powyższy kod był dla mnie bardzo pomocny i mam nadzieję, że treść ta nadaje znaczenie powyższemu kodowi.

Gson JsonReader documentation wyjaśnia, jak radzić parsowanie JsonObjects i JsonArrays:

  • W ramach metod obsługi tablicy, najpierw zadzwonić beginArray(), aby konsumować nawias otwierający tablicy za. Następnie utwórz pętlę while, która gromadzi wartości, kończąc, gdy hasNext() ma wartość false. Na koniec przeczytaj nawias zamykający tablicy, wywołując metodę endArray().
  • W metodach obsługi obiektów, najpierw wywołaj metodę beginObject() w celu użycia klamry otwierającej obiektu. Następnie utwórz pętlę while, która przypisuje wartości do zmiennych lokalnych na podstawie ich nazwy. Ta pętla powinna zakończyć się, gdy hasNext() ma wartość false. Na koniec przeczytaj nawias zamykający obiektu, wywołując funkcję endObject().