簡體   English   中英

如何解析嵌套 JSON 結果中的動態 JSON 鍵?

[英]How to parse a dynamic JSON key in a Nested JSON result?

我有以下格式的 JSON 結果,其中JSON Lint將其顯示為“有效響應”。

我的問題是:如何訪問“question_mark”的內容,因為“141”、“8911”等都是動態值?

我用於訪問“產品”值的示例代碼。

//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"
            }
       ]
}

我的問題標題“動態密鑰”可能是錯誤的,但我目前不知道這個問題的更好名稱是什么。

任何幫助將不勝感激!

使用JSONObject keys()獲取鍵,然后迭代每個鍵以獲取動態值。

大致代碼如下所示:


// searchResult refers to the current element in the array "search_result" but whats searchResult?
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 來生成 getter/setter、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)}

使用Google Gson的示例

來自問題的 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"
        }
    ]
}

示例代碼:

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class GsonExercise {
    public static void main(String[] args) {
        String jsonString = "{\"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\"}]}";
        JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);
        JsonArray ja = jobj.get("search_result").getAsJsonArray();
        ja.forEach(el -> {
            System.out.println("product: " + el.getAsJsonObject().get("product").getAsString());
            JsonObject jo = el.getAsJsonObject().get("question_mark").getAsJsonObject();            
            jo.entrySet().stream().forEach(qm -> {
                String key = qm.getKey();
                JsonElement je = qm.getValue();
                System.out.println("key: " + key);
                JsonObject o = je.getAsJsonObject();
                o.entrySet().stream().forEach(prop -> {
                    System.out.println("\tname: " + prop.getKey() + " (value: " + prop.getValue().getAsString() + ")");
                });
            });
            System.out.println("");
        });
    } 
}

輸出:

product: abc
key: 141
    name: count (value: 141)
    name: more_description (value: this is abc)
    name: seq (value: 2)
key: 8911
    name: count (value: 8911)
    name: more_desc (value: this is cup)
    name: seq (value: 1)

product: XYZ
key: 379
    name: count (value: 379)
    name: more_desc (value: this is xyz)
    name: seq (value: 5)
key: 845
    name: count (value: 845)
    name: more_desc (value: this is table)
    name: seq (value: 6)
key: 12383
    name: count (value: 12383)
    name: more_desc (value: Jumbo)
    name: seq (value: 4)
key: 257258
    name: count (value: 257258)
    name: more_desc (value: large)
    name: seq (value: 1)

同樣的事情也可以使用 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具有動態對象鍵,因此我們將使用JsonParser類解析此 json 字符串。

  //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>獲取動態鍵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();


             }
        }

類似地,可以使用Map.Entry<String,JsonElement>解析任何級別的動態 json

您可以使用此邏輯。 使用 org.json 庫

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20211205</version>
</dependency>


public void parseJson(JSONObject jo, String key) {
Iterator<?> keyIterator;
String key1;
if (jo.has(key)) {
    System.out.println(jo.get(key));
} else {
    keyIterator = jo.keys();
    while (keyIterator.hasNext()) {
    key1 = (String) keyIterator.next();
    if (jo.get(key1) instanceof JSONObject) {
        if (!jo.has(key))
        parseJson(jo.getJSONObject(key1), key);
    } else if (jo.get(key1) instanceof JSONArray) {
        JSONArray jsonarray = jo.getJSONArray(key1);
        Iterator<?> itr = jsonarray.iterator();
        while (itr.hasNext()) {
        String arrayString = itr.next().toString();
        JSONObject jo1 = new JSONObject(arrayString);
        if (!jo1.has(key)) {
            parseJson(jo1, key);
        }
        }

    }
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM