如何使用Volley和Adapter处理数组或对象的JSON响应

时间:2016-08-22 17:44:55

标签: arrays json adapter android-volley

如果搜索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,所以不确定答案是否适用。感谢

1 个答案:

答案 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