1. 程式人生 > >java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 39 path $

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 39 path $

        我在使用retrofit和Gson配合時,出現了這個問題,疑惑中亂七八糟瞎搞了一個下午沒有解決。期間懷疑Gson解析不能使用泛型(因為我的解析使用了泛型),後來又覺得可能是我的關鍵字正好是解析器的某個關鍵字導致的異常,也打算過自定義Gson的解析過程,其實這些都不是。

        第二天才搞明白,真正的問題是我的資料結構有問題,或者說我的解析出現了問題。

        例如下面Json字串:

        {"code":1,"info":"success","results":{"id":"1","name":"hehe"}}

        results對應的應該是一個實體類,如果這個時候想把他解析為String或者List就會出現異常。

        如果參考使用GsonForm處理後的資料模型,幾乎不會出現問題;加入result後面的內容可能在請求時會因為某些原因會存在格式上的變化,這個時候就有出現該異常的風險。Gson中,關鍵字後面出現""引起來的內容將會被只認為是STRING,“{}”只被認為是類,“[]”只被認為是List,這個幾乎是強制性的。

        就是說如果你的實體預計是獲取String的變數,但是關鍵字後面對應的卻出現了“{”或“[”,那麼這個轉換將被認為是錯誤的,丟擲異常。

        解決辦法:後臺輸出穩定的Gson格式。