Подтвердить что ты не робот

Разбирайте файл JSON с помощью GSON

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

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

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

4b9b3361

Ответ 1

Imo, лучший способ проанализировать ваш ответ 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, a JsonReader или JsonElement.

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

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

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

Ответ 2

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

Ответ 3

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

Документация Gson JsonReader объясняет, как обрабатывать парсинг JsonObjects и JsonArrays:

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