【发布时间】: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())。