Android 没有值时JSONObject解析错误

Android 没有值时JSONObject解析错误,android,json,jsonexception,Android,Json,Jsonexception,我有一个JSON,看起来像这样: { "notifications": { "0": { "id": "27429", "uID": "6967", "text": "Text 1" }, "1": { "id": "27317", "uID": "6967", "text": "Text 2" }, "2": { "id": "27315",

我有一个
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"
    }
}
}
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);
}
for (int i = 0; i < jSearchData.length(); i++) {
    JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");

    String text = jNotification0.getString("text");

    System.out.println("Text: " + text);
}
我从响应中取出
“text”
字符串,因为我的代码如下所示:

{
"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"
    }
}
}
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);
}
for (int i = 0; i < jSearchData.length(); i++) {
    JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");

    String text = jNotification0.getString("text");

    System.out.println("Text: " + text);
}
然后我的上述逻辑失败,我得到异常声明
org.json.JSONException:No value for 1

我怎样才能克服这个问题


任何帮助都将不胜感激。

您可以使用
rootObj.has(“1”)
或使用
rootObj.optJSONObject(“1”)

如果此对象具有名称映射,则前者返回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");
      }
}
迭代器keys=jSearchData.keys(); while(keys.hasNext()){ String key=keys.next(); JSONObject jNotification0=jSearchData.optJSONObject(键); 如果(jNotification0!=null){ String text=jNotification0.getString(“文本”); 字符串uID=jNotification0.getString(“uID”); 字符串id=jNotification0.getString(“id”); } }
编辑:这是错误的,我读到fast时没有意识到jSearchData是一个对象而不是数组。但在我看来,如果它实际上是一个数组而不是一个对象,那么if将更有意义

没有必要对4进行硬编码。只需获取数组的长度并在其中循环,如下所示:

{
"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"
    }
}
}
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);
}
for (int i = 0; i < jSearchData.length(); i++) {
    JSONObject jNotification0 = jSearchData.getJSONObject("" + i + "");

    String text = jNotification0.getString("text");

    System.out.println("Text: " + text);
}
for(int i=0;i
正如您所看到的
jSearchData
JSONObject
。看起来像这样
JSONObject jSearchData=rootObj.getJSONObject(“通知”)我们如何在循环中使用它。而不是迭代
i
迭代@Selvin我怎么能这样做,你能给我一个例子吗。伪代码:
var-keys=jSearchData.keys();对于(key-in-keys){var-jNotificationX=jSearchData.getJSONObject(key);}
好的,谢谢你的回答,但是我不知道如何用当前的代码实现它。正如你们所看到的,我有for循环,我怎样才能在其中使用键呢?