2016-03-07 191 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

相關問題