1. 程式人生 > >com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was

可能的錯誤:1、bean類欄位型別和欄位名稱不一致。

2、伺服器訪問得到的字串不是純json前面有空格和回車等字元(難發現)。

3、如果訪問的json字串不是utf-8編碼時,用Gson解析會出這種問題,在日誌中列印會發現json的{}前面有亂碼字元,也需要注意一下。這是因為不同的編碼的原因導致的,因此必須訪問utf-8的json字串,才會減少這種問題。

問題可能是:字串並不是純json字串,開頭可能會帶有空字元或者回車符,這屬於伺服器問題,但我們也可以解決。

最重要原因的我們網路請求後結果是字串,而不是json,因此需要處理。

 

用Gson gson = new Gson();

json = gson.fromJson(response, InfoBean.class

);

解析時發現無論如何都報錯誤,而且InfoBean沒有一點問題

並且在瀏覽器上訪問該url能打出請求的資料,並且logcat也能打印出請求到的字串。


瀏覽器這樣列印好像沒有問題,但是細心會發現前面有兩個字元。這在解析時會使Gson無法識別。需要對請求成功的字串進行處理,轉換成標準字串,或者告訴伺服器人員修改資料。

排除了程式碼錯誤,我最終找到了解決辦法:

java.lang.IllegalStateException: ExpectedBEGIN_OBJECT but was STRING at line 1 column 1 path $

含義:非法引數,開始讀取時應該是{}括號,所以需要處理String字串,它有可能不是標準的json資料。

當然,這是在排除自身bean物件有問題的前提下需要注意的,細心才能解決問題。

當然我建議,將請求的字串要特別關注一下是否頭部有問題,因為伺服器端的哥們也不是特別細心的,像空格和回車特別難以發現,而且特別容易產生。希望能幫助有這樣問題的朋友們。