gson句柄:预计BEGIN_OBJECT但是BEGIN_ARRAY

时间:2016-03-07 12:13:10

标签: android gson deserialization retrofit

我正在使用Retrofit和Gson进行API调用。我的服务器响应有问题。对于某些属性,它发送空JSONArray而不是空JSONObject。 e.g:

正常情况:

  {
    "pagination": { 
      "links": {
        "next": "http://api.com/nextlink"
      } 
    }
  } 

但有时当"链接"是空的,服务器发给我这个:

  {
    "pagination": { 
      "links": []
    }
  } 

导致java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY

我知道我可以使用自定义JsonDeserializer来处理对象" Pagination"创建registerTypeAdapter时会GsonBuilder

但我的问题是:对于所有回复,一般可以处理这种情况吗?我无法访问API,因此我无法更改它,而且我也不知道哪些属性可以为空JSONArray而不是JSONObject

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试此操作以检查它是否为对象

yourJson.get("links").isJsonObject()

检查这些方法

isJsonArray()
isJsonObject()
isJsonNull()

答案 1 :(得分:0)

使用instanceof函数检查后,您可以使用JSONTokener获取普通的Object,请尝试以下方法:

String jsonData =  "{...}"; //your json data string
JSONTokener tokener = new JSONTokener(jsonData);
    try {
        Object parsedObj = tokener.nextValue();
        if (parsedObj instanceof JSONObject) {

               //do something here
        }else if (parsedObj instanceof JSONArray){
             //do something here
        }
     }catch(Exception ex){}

在此处阅读更多enter link description here