2013-05-04 4 views
29

Я хочу разобрать этот JSON файл в JAVA использованием GSON:Анализировать JSON-файл с помощью 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"] 
     } 
    } 
} 

, но я не знаю, как acceed в корневой элемент, который: дескриптор, после этого app3 элемент и, наконец, имя элемент.

Я следовал этому руководству http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/, но он не показывает случай наличия элементов root и childs.

+0

Ниже приведен пример http://thegeekyland.blogspot.com/2015/11/serializing-and-deserializing-json-from.html – Arlind

ответ

46

Им, лучший способ разобрать ваш ответ JSON с GSON будет создавать классы, «спичка» ваш ответ, а затем использовать Gson.fromJson() метод.
Например:

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

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

Затем просто использовать:

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

Где yourJson может быть String, любой Reader, JsonReader или JsonElement.

Наконец, если вы хотите получить доступ к какой-либо конкретной области, вы просто должны сделать:

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

Вы всегда можете разобрать JSON вручную, как предложено в других ответов, но лично я думаю, что такой подход является более ясным, более поддерживаемым в долгосрочной перспективе, и он лучше подходит для всей идеи JSON.

+1

Я считаю, что это заставляет дух JSON намного лучше, чем подход «ручной парсер» – tucuxi

+0

Спасибо, но файл JSON не будет содержать только app1, app2, app3, он будет динамическим, поэтому я не смогу исправить class атрибуты .. – Copernic

+0

@Mehdi см. отредактированный код, который еще проще и позволяет вам иметь произвольное количество * приложений * объектов в вашем ответе JSON, просто изменяя тип для «Map» ... Btw, У вас будет произвольное количество объектов приложения, вы должны сказать это в своем оригинальном посте! ;) – MikO

15

Я использую 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

Спасибо :), но почему мы должны установить 'jsonReader.beginObject();' и 'jsonReader.endObject();' в каждом методе? (main и readApp) Спасибо :) – Copernic

+0

Я понимаю, спасибо, Гир. – Copernic

+0

Согласен с miko. GSON - очень мощная библиотека для преобразования JSON-Java Object и наоборот. Я использовал ее таким образом в большинстве проектов. – Gere

2

Одна вещь, которую следует помнить при решении таких проблем является то, что в JSON файлом, то { указывает JSONObject и [ указывает JSONArray. Если бы можно было правильно управлять ими, было бы очень легко выполнить задачу разбора файла JSON. Вышеприведенный код был действительно очень полезен для меня, и я надеюсь, что этот контент добавит некоторое значение к вышеуказанному коду.

Gson JsonReader documentation объясняет, как справиться с парсинг JsonObjects и JsonArrays:

  • В обработке массивов методами, сначала вызовите beginArray(), чтобы потреблять открывающую скобку массива. Затем создайте цикл while, который накапливает значения, заканчивая, когда hasNext() является ложным. Наконец, прочитайте закрывающий скоб массива, вызвав endArray().
  • В методах обработки объектов сначала вызовите beginObject(), чтобы использовать открытую скобку объекта. Затем создайте цикл while, который присваивает значения локальным переменным на основе их имени. Этот цикл должен завершиться, когда hasNext() - false. Наконец, прочитайте закрывающую фигуру объекта, вызвав endObject().
Смежные вопросы