2016-03-07 126 views
1

我正在使用Retrofit和Gson来进行API调用。我对服务器的响应有问题。对于某些属性,它将发送空JSONArray而不是空JSONObject。例如: -gson句柄:预计BEGIN_OBJECT,但是BEGIN_ARRAY

在正常情况下

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

,但有时当 “链接” 是空的,服务器发送我:

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

造成java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY

我知道我可以在创建GsonBuilder时使用对象“分页”和registerTypeAdapter使用自定义JsonDeserializer来处理它。

但我的问题是:这是可能的一般处理这种情况下的所有反应?我无法访问API,所以我无法更改它,并且我不知道我可以获得哪些属性为JSONArray而不是JSONObject

谢谢。

+1

[预计BEGIN_ARRAY但是BEGIN_OBJECT](http://sachinpatil.com/blog/2012/07/03/gson/) - 类似的问题与一般的解决方案。 – Ziem

回答

0

试试这个来检查它是否是一个对象或不

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

检查这些方法

isJsonArray() 
isJsonObject() 
isJsonNull() 
+0

嗨Ravi,谢谢你的回复。但这不是我的问题的答案。我写道,我可以处理这种情况(即对象分页)。但是我正在寻找一个解决方案,一般来说,所有的答案都是一样的。问题是,我不知道所有情况,其中属性可以具有空的JSONArray []而不是JSONObject。 – Daniel

0

您可以使用JSONTokener得到正常物体的instanceof功能后检查,尝试波纹管:

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

相关问题