1

我有一个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"logs.

现在,我的问题是,当我从服务器获得只有 1 或 2 个数据的响应时,如下所示:

{
"notifications": {
    "0": {
        "id": "27429",
        "uID": "6967",
        "text": "Only one text here"
    }
}
}

然后我的上述逻辑失败,我得到异常说明org.json.JSONException: No value for 1

我该如何克服这个问题。

任何形式的帮助将不胜感激。

4

2 回答 2

4

您可以测试密钥是否存在rootObj.has("1")或使用rootObj.optJSONObject("1");

如果此对象具有名称映射,则前者返回 true。后者返回由 name 映射的值,如果它存在并且是 a 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");
      }
}
于 2013-07-05T12:35:51.240 回答
-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);
}
于 2013-07-05T12:37:49.563 回答