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

Как разобрать динамический ключ JSON в результате результата Nested JSON?

У меня есть результат JSON в следующем формате, который JSON Lint показывает это как "Действительный ответ".

Мой вопрос: как мне получить доступ к содержимому "question_mark", так как "141", "8911" и т.д. - все динамические значения?

Мой пример кода для доступа к значению "продукт".

//Consider I have the first <code>JSONObject</code> of the "search_result" array and 
//I access it "product" value as below.
String product = jsonObject.optString("product"); //where jsonObject is of type JSONObject.
//<code>product<code> now contains "abc".

JSON:

{
 "status": "OK",
 "search_result": [

            {
                "product": "abc",
                "id": "1132",
                "question_mark": {
                    "141": {
                        "count": "141",
                        "more_description": "this is abc",
                        "seq": "2"
                    },
                    "8911": {
                        "count": "8911",
                        "more_desc": "this is cup",
                        "seq": "1"
                    }
                },
                "name": "some name",
                "description": "This is some product"
            },
            {
                "product": "XYZ",
                "id": "1129",
                "question_mark": {
                    "379": {
                        "count": "379",
                        "more_desc": "this is xyz",
                        "seq": "5"
                    },
                    "845": {
                        "count": "845",
                        "more_desc": "this is table",
                        "seq": "6"
                    },
                    "12383": {
                        "count": "12383",
                        "more_desc": "Jumbo",
                        "seq": "4"
                    },
                    "257258": {
                        "count": "257258",
                        "more_desc": "large",
                        "seq": "1"
                    }
                },
                "name": "some other name",
                "description": "this is some other product"
            }
       ]
}

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

Любая помощь будет принята с благодарностью!

4b9b3361

Ответ 1

Используйте JSONObject keys(), чтобы получить ключ, а затем итерации каждой клавиши, чтобы перейти к динамическому значению.

Пример кода будет выглядеть следующим образом:


    // searchResult refers to the current element in the array "search_result"
    JSONObject questionMark = searchResult.getJSONObject("question_mark");
    Iterator keys = questionMark.keys();

    while(keys.hasNext()) {
        // loop to get the dynamic key
        String currentDynamicKey = (String)keys.next();

        // get the value of the dynamic key
        JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey);

        // do something here with the value...
    }

Ответ 2

Другая возможность заключается в использовании Gson (Примечание: здесь я использую lombok для генерации getters/seters, toString и т.д.):

package so7304002;

import java.util.List;
import java.util.Map;

import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JsonDemo {
    @Data
    private static class MyMap {
        private int count;

        @SerializedName("more_description")
        private String moreDescription;

        private int seq;
    }

    @Data
    private static class Product {
        private String product;

        private int id;

        @SerializedName("question_mark")
        private Map<String, MyMap> questionMark;
    }

    @Data
    private static class MyObject {
        private String status;

        @SerializedName("search_result")
        private List<Product> searchResult;
    }

    private static final String INPUT = ""; // your JSON

    public static void main(final String[] arg) {
        final MyObject fromJson = new Gson().fromJson(INPUT, 
            new TypeToken<MyObject>(){}.getType());
        final List<Product> searchResult = fromJson.getSearchResult();
        for (final Product p : searchResult) {
            System.out.println("product: " + p.getProduct() 
                + "\n" + p.getQuestionMark()+ "\n");
        }
    }
}

Вывод:

product: abc
{141=JsonDemo.MyMap(count=141, moreDescription=this is abc, seq=2), 
 8911=JsonDemo.MyMap(count=8911, moreDescription=null, seq=1)}

product: XYZ
{379=JsonDemo.MyMap(count=379, moreDescription=null, seq=5), 
 845=JsonDemo.MyMap(count=845, moreDescription=null, seq=6), 
 12383=JsonDemo.MyMap(count=12383, moreDescription=null, seq=4), 
 257258=JsonDemo.MyMap(count=257258, moreDescription=null, seq=1)}

Ответ 3

То же самое можно сделать с помощью GSON, но вместо использования адаптера конвертера GSON для преобразования в POJO. мы проанализируем его вручную. что дает нам гибкость в случае динамических данных JSON.
скажем, формат JSON выглядит как в моем случае ниже.

{
  "dateWiseContent": {
    "02-04-2017": [
      {
        "locality": " Cross Madian Cross Rd No 4"
      }
    ],
    "04-04-2017": [
      {
        "locality": "Dsilva Wadi"
      },
      {
        "locality": " Cross Madian Cross Rd No 4",
        "appointments": []
      }
    ]
  }
}

в этом случае dateWiseContent имеет динамические клавиши объекта поэтому мы проанализируем эту строку json, используя класс JsonParser.

  //parsing string response to json object
 JsonObject jsonObject = (JsonObject) new JsonParser().parse(resource);
  //getting root object
 JsonObject dateWiseContent = jsonObject.get("dateWiseContent").getAsJsonObject();

получить динамические клавиши с помощью Map.Entry<String, JsonElement>, как указано ниже

  // your code goes here
         for (Map.Entry<String, JsonElement> entry : dateWiseContent.entrySet()) {

           //this gets the dynamic keys
            String  dateKey = entry.getKey();

            //you can get any thing now json element,array,object according to json.

            JsonArray jsonArrayDates = entry.getValue().getAsJsonArray();
            int appointmentsSize = jsonArrayDates.size();

             for (int count = 0; count < appointmentsSize; count++) {

                   JsonObject objectData = jsonArrayDates.get(count).getAsJsonObject();
                   String locality = objectData.get("locality").getAsString();


             }
        }

аналогичным образом любой уровень динамического json можно проанализировать с помощью Map.Entry<String,JsonElement>