Как разобрать динамический ключ 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"
}
]
}
Мое имя вопроса "динамический ключ" может быть неправильным, но на данный момент я не знаю, какое лучшее имя для этой проблемы.
Любая помощь будет принята с благодарностью!
Ответы
Ответ 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>