簡體   English   中英

是否可以在不知道鍵的情況下從一組JSON對象獲取值?

[英]Is it possible to get values from a set of JSON objects without knowing their keys?

我正在開發一個使用JSON與Web API通訊的應用程序。 在一種錯誤情況下,API會向我發送一個“錯誤捆綁包”,看起來像這樣:

{
    "status_code": " 400",
    "message": " Bad Request",
    "errors": [
        { " error1": "errorMessage1" },
        { " error2": "errorMessage2" },
        { " error3": "errorMessage3" },
        ...
        { " errorN": "errorMessageN" }
    ]
}

對我而言,JSON中真正重要的是errorMessage因為我需要它們成為錯誤對話框的內容,然后再向用戶顯示。

但是在實際情況下,這些error將擁有彼此不同的鍵(例如PasswordErrorObjectXIsNeeded等),老實說,我無法真正預測可能存在的error 增加了將來可能添加的新錯誤的可能性。

我以前的想法是遍歷JSON對象的errors數組,然后獲取它們的值。 就像處理Map 但是我似乎無法按照自己的意願去做。

作為說明,這是我的想法:

StringBuilder errorMessages = new StringBuilder();
JSONArray errors = returnJson.getJsonArray("errors");
for(JSONObject error : errors) {
    errorMessages.append(error.getValue());
}

可以做這種事情嗎? 怎么樣?

編輯 :根據要求,我將列出我的問題的詳細信息:

  • 我正在使用Android提供的默認JSON庫(或者是Java?),該庫原來是org.json
  • 該API由我公司提供,不太可能更改。 由於許多系統已經依賴它。

在與JSON相關的問題中,您應該明確說明您使用的是哪個JSON庫,因為其中有很多庫,並且類似JSONArray類名也是如此。

如果您使用的是org.json API(它既舊又過時,因此不建議使用),則可以使用keys方法返回obejct鍵的迭代器:

Iterator it = errors.keys();
while(it.hasNext()) {
    String key = it.next().toString();
    errorMessages.append(errors.get(key));
}

這取決於您用來處理JSON文檔的API。 如果使用的是www.json.org定義的API,則可以遍歷鍵 ,或實際生成所需的數組: JSONObject.toJSONArray(...)

好吧,有點。 您只會不知所措而走得更遠,但是一點點的正則表達式可以在這里提供幫助。

請注意,我一般不會鼓勵這種用法。 如果您的結構要求您實際上並不在乎鍵,請重新排列JSON的結構,以便僅返回值。

理想的結構如下所示:

{
    "status_code": " 400",
    "message": " Bad Request",
    "errors": ["errorMessage1", "errorMessage2","errorMessage3","errorMessageN"]
}

說:

  • 我正在使用org.json
  • 我精心制作了一個正則表達式來分組我關心的JSON對象的值部分。

     .*?:\\"(.*?)\\".*? 

正則表達式可視化

Debuggex演示

  • 我正在使用LinkedHashSet而不是StringBuilder
String json = "{\n" +
                      "    \"status_code\": \" 400\",\n" +
                      "    \"message\": \" Bad Request\",\n" +
                      "    \"errors\": [\n" +
                      "        { \" error1\": \"errorMessage1\" },\n" +
                      "        { \" error2\": \"errorMessage2\" },\n" +
                      "        { \" error3\": \"errorMessage3\" },\n" +
                      "        { \" errorN\": \"errorMessageN\" }\n" +
                      "    ]\n" +
                      "}";

JSONObject returnJson = new JSONObject(json);
JSONArray errors = returnJson.getJSONArray("errors");
Pattern pattern = Pattern.compile(".*?:\"(.*?)\".*?");
Set<String> errorSet = new LinkedHashSet<>();
for(int i = 0; i < errors.length(); i++) {
    Matcher matcher = pattern.matcher(errors.get(i).toString());
    if(matcher.matches()) {
        errorSet.add(matcher.group(1));
    }
}
System.out.println(errorSet);

暫無
暫無

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

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