如果搜索2个或更多字段,则JSON响应是一个数据数组:
{
"query": {
"count": 2,
"created": "2016-08-22T16:57:40Z",
"lang": "en-US",
"results": {
"data": [{
.
.
.
}]
}
}
}
但是当只搜索1个字段时,JSON响应是数据对象:
{
"query": {
"count": 1,
"created": "2016-08-22T17:03:53Z",
"lang": "en-US",
"results": {
"data": {
.
.
.
}
}
}
}
我使用一组数据可以正常工作。但是当返回单个对象时,屏幕是空白的。 logcat给了我一个typeMismatch错误,我非常肯定是由于这一行
JSONArray data = results.getJSONArray("data");
我可以使用Volley来处理这两种类型的回复吗?不知道我是否需要创建另一个适配器或什么?阅读几个类似的帖子,但他们都处理了Retrofit和GSON,所以不确定答案是否适用。感谢
答案 0 :(得分:2)
您正在创建一个JSONArray,它希望解析一个数组。这就是为什么同时存在JSONObject和JSONArray来处理这两种情况的原因。如果解析失败,它将抛出JSONException。
首先,如果您可以控制API,只需确保您的JSON响应返回一个元素数组,无论是否为1,或多个。这样JSONArray解析永远不会失败
假设您无法控制实际的API,请利用Java的try..catch。如果项目的解析失败,JSONArray将返回特定的异常
try {
//Test if the item is an array
JSONArray data = results.getJSONArray("data");
//Do your other logic
} catch (JSONException exc) {
//Parsing failed, test as an object
try {
JSONObject data = results.getJSONObject("data");
//Do your other logic
catch (JSONException exc) {
//Parsing failed,.. do your failsafe
}
}
}
(使用例外类型) https://developer.android.com/reference/org/json/JSONArray.html#JSONArray()
这是一种痛苦吗?是。这就是为什么如果你能让它总是返回一个数组,从长远来看它对你来说更好。有时甚至没有办法绕过嵌套的try..catch来处理这样的情况。
(关于try / catch的其他信息) https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html