我有一个JSON
,如下所示:
{
"notifications": {
"0": {
"id": "27429",
"uID": "6967",
"text": "Text 1"
},
"1": {
"id": "27317",
"uID": "6967",
"text": "Text 2"
},
"2": {
"id": "27315",
"uID": "6967",
"text": "Text 3"
},
"3": {
"id": "27314",
"uID": "6967",
"text": "Text 4"
},
"4": {
"id": "27312",
"uID": "6967",
"text": "Text 5"
}
}
}
我从响应中取出"text"
字符串,因此我的代码如下所示:
JSONObject rootObj = new JSONObject(result);
JSONObject jSearchData = rootObj.getJSONObject("notifications");
int maxlimit = 4;
for (int i = 0; i < maxlimit; i++) {
JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");
String text = jNotification0.getString("text");
System.out.println("Text: " + text);
}
现在这完全正常,我得到了"text"
中的所有4 logs
。
现在,我的问题是当我从服务器获得只有1或2个数据的响应时,就像这样:
{
"notifications": {
"0": {
"id": "27429",
"uID": "6967",
"text": "Only one text here"
}
}
}
然后我的上述逻辑失败了,我得到例外陈述org.json.JSONException: No value for 1
我如何克服这个问题。
任何形式的帮助都将受到赞赏。
答案 0 :(得分:4)
您可以使用rootObj.has("1")
或使用rootObj.optJSONObject("1");
如果此对象具有name的映射,则前者返回true。后者返回按名称映射的值(如果存在)并且是JSONObject
,否则返回null。
或者你可以通过rootObj中的键进行交互,这样:
Iterator<String> keys = jSearchData.keys();
while (keys.hasNext()) {
String key = keys.next();
JSONObject jNotification0 = jSearchData.optJSONObject(key);
if (jNotification0 != null) {
String text = jNotification0.getString("text");
String uID = jNotification0.getString("uID");
String id = jNotification0.getString("id");
}
}
答案 1 :(得分:-1)
编辑:这是错误的,我快速阅读并没有意识到jSearchData是一个对象,而不是一个数组。但在我看来,如果它实际上是一个数组而不是一个对象,那将会更有意义。
没有必要对4进行硬编码。只需取出数组的长度并循环遍历它,就像这样:
for (int i = 0; i < jSearchData.length(); i++) {
JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");
String text = jNotification0.getString("text");
System.out.println("Text: " + text);
}