【问题标题】:Error 'JSONException: Value [] of type org.json.JSONArray cannot be converted to JSONObject' in Android错误'JSONException:类型 org.json.JSONArray 的值 [] 无法在 Android 中转换为 JSONObject'
【发布时间】:2021-01-12 03:25:53
【问题描述】:

我是 JSON 的新手,我一直在参考一些 youtube 视频,了解链接 question 中给出的关于如何处理错误的问题,但我仍然不明白为什么我会遇到同样的错误。

错误日志如下:

2021-01-12 10:30:10.327 30666-315/... W/System.err: org.json.JSONException: Value [{"lastUpdateTs":1610342055312,"key":"capacity","value":20},{"lastUpdateTs":1610342069003,"key":"free","value":4},{"lastUpdateTs":1610342055324,"key":"capacity","value":20},{"lastUpdateTs":1610342070857,"key":"free","value":4}] of type org.json.JSONArray cannot be converted to JSONObject
2021-01-12 10:30:10.327 30666-315/... W/System.err:     at org.json.JSON.typeMismatch(JSON.java:112)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:168)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:181)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at ...PremisesListTaskLoader.loadInBackground(PremisesListTaskLoader.java:118)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at ....PremisesListTaskLoader.loadInBackground(PremisesListTaskLoader.java:20)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at androidx.loader.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:307)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:60)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:48)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at androidx.loader.content.ModernAsyncTask$2.call(ModernAsyncTask.java:141)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2021-01-12 10:30:10.328 30666-315/... W/System.err:     at java.lang.Thread.run(Thread.java:919)

这是我的代码:

try {      
      if (code2 / 100 == 2) {
            BufferedReader reader2 = new BufferedReader(new InputStreamReader(connection2.getInputStream()));
            StringBuilder sb2 = new StringBuilder();
            String input2;
            while ((input2 = reader2.readLine()) != null) {
                  sb2.append(input2);
            }
            reader2.close();

            JSONObject response2 = new JSONObject(sb2.toString());  // <- The line mentioned   at ...PremisesListTaskLoader.loadInBackground(PremisesListTaskLoader.java:118)
            JSONArray data2 = response2.getJSONArray("data");
            int length2 = data2.length();

            for (int i2 = 0; i2 < length2; i2++) {
                  JSONObject object2 = data2.getJSONObject(i2);
                  String deviceType = object2.getString("key");
                  String deviceId = object2.getString("value");
            }
    }
      connection2.disconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }

我要检索的数据(存储在input2)如下:

[
  {
    "lastUpdateTs": 1604651123669,
    "key": "capacity",
    "value": 20
  },
  {
    "lastUpdateTs": 1606467758647,
    "key": "free",
    "value": 12
  }
]

【问题讨论】:

  • 请学习 JSON。 [ ] 是一个 JSON 数组,那么您为什么认为将其解析为 JSON 对象会起作用呢?由于根是一个数组,把new JSONObject(sb2.toString())改成new JSONArray(sb2.toString())

标签: java android json


【解决方案1】:
[
  {
    "lastUpdateTs": 1604651123669,
    "key": "capacity",
    "value": 20
  },
  {
    "lastUpdateTs": 1606467758647,
    "key": "free",
    "value": 12
  }
]

这是 JSONArray 格式导致 JSONObject response2 = new JSONObject(sb2.toString()); 无法转换

替换:

JSONObject response2 = new JSONObject(sb2.toString());  
JSONArray data2 = response2.getJSONArray("data");
int length2 = data2.length();

for (int i2 = 0; i2 < length2; i2++) {
   JSONObject object2 = data2.getJSONObject(i2);
   String deviceType = object2.getString("key");
   String deviceId = object2.getString("value");
}

与:

JSONArray jsonArray = new JSONArray(sb2.toString());  
for (int i2 = 0; i2 < jsonArray.length(); i2++) {
   JSONObject object2 = jsonArray.getJSONObject(i2);
   String deviceType = object2.getString("key");
   String deviceId = object2.getInt("value");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多