如何parsing嵌套的JSON结果中的dynamicJSON键?

我有以下格式的JSON结果, JSON Lint显示这是“有效的响应”。

我的问题是:如何查看“question_mark”的内容,因为“141”,“8911”等都是dynamic值?

我的示例代码访问“产品”的价值。

//Consider I have the first <code>JSONObject</code> of the "search_result" array and //I access it's "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" } ] } 

我的问题标题“dynamic密钥”可能是错误的,但我现在还不知道这个问题有什么更好的名称。

任何帮助将不胜感激!

使用JSONObject键()获取键,然后遍历每个键获取dynamic值。

大致的代码将如下所示:

 // 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... } 

另一种可能是使用Gson (注意,我在这里使用lombok来生成getters / setters,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)} 

使用GSON也可以做同样的事情,而不是使用GSON转换器适配器转换成POJO。 我们将手动parsing它。 这为我们提供了dynamicJSON数据的灵活性。
比方说我的情况下,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": [] } ] } } 

在这种情况下, dateWiseContentdynamic的对象键,所以我们将使用JsonParser类来parsing这个JSONstring。

  //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>获取dynamic键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(); } } 

同样,任何级别的dynamicjson都可以使用Map.Entry<String,JsonElement>来parsing