Gson發生錯誤訊息: JsonParseException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT

這個算是剛開始用Gson的時候很容易發生的問題,
這個錯誤訊息是在告訴你:API 回傳的結果是JSON的Array結構,但你的程式卻寫為處理Object結構。

首先看一下你的API回傳的格式,以下列的API為例:
https://jsonplaceholder.typicode.com/users
回傳的結果為:

從API的回傳結果可以看得出來,最外層是用Array包住,所以如果程式如同下列使用Object包覆的方式撰寫,
(下列使用Kotlin的語法撰寫, response為API回傳後的結果)
val gson = Gson()                                
val type = object : TypeToken<UserGson>() {}.type
val user = gson.fromJson<UserGson>(response,type)

就會出現
JsonParseException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT

所以只要將程式改寫為用ArrayList去包住Gson的資料物件,即可解決這個錯誤
val gson = Gson()                                             
val type = object : TypeToken<ArrayList<UserGson>>() {}.type  
val users = gson.fromJson<ArrayList<UserGson>>(response, type)


範例程式碼:
https://github.com/ukyo99999/gsonexample

Reference:
https://github.com/google/gson/blob/master/UserGuide.md
https://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin-array

留言

這個網誌中的熱門文章

ISO 27001 LA 主導稽核員 考照心得

Android如何實作強制App版本更新

如何實作從API抓取資料顯示在列表頁(ListView)上