[英]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
將擁有彼此不同的鍵(例如PasswordError
, ObjectXIsNeeded
等),老實說,我無法真正預測可能存在的error
。 增加了將來可能添加的新錯誤的可能性。
我以前的想法是遍歷JSON對象的errors
數組,然后獲取它們的值。 就像處理Map
。 但是我似乎無法按照自己的意願去做。
作為說明,這是我的想法:
StringBuilder errorMessages = new StringBuilder();
JSONArray errors = returnJson.getJsonArray("errors");
for(JSONObject error : errors) {
errorMessages.append(error.getValue());
}
可以做這種事情嗎? 怎么樣?
編輯 :根據要求,我將列出我的問題的詳細信息:
org.json
。 在與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對象的值部分。
.*?:\\"(.*?)\\".*?
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.