Gson解析出現類似錯誤,com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_AR
阿新 • • 發佈:2019-01-05
<span style="font-size:18px;">Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 45 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176) at com.google.gson.Gson.fromJson(Gson.java:803) at com.google.gson.Gson.fromJson(Gson.java:768) at com.google.gson.Gson.fromJson(Gson.java:717) at com.google.gson.Gson.fromJson(Gson.java:689) at GsonUtils.changeGsonToBean(GsonUtils.java:22) at Test.main(Test.java:25) Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 45 at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:338) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:79) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) ... 6 more</span>
類似這種錯誤的原因,Expected BEGIN_ARRAY but was STRING at line 1 column 45.
可以看到提示大概的意思就是,期望是BEGIN_ARRAY,但是是STRING。
下面是例子:
<span style="font-size:18px;">import java.io.Serializable; import java.util.List; public class Test { public static List<ArticleImage> articleimglist; public static void main(String[] args) { String str = "{\"age\":23,\"name\":\"dsfds\", <span style="background-color: rgb(255, 102, 102);">\"articleimglist\":\"\"</span>}"; Article ar = GsonUtils.changeGsonToBean(str, Article.class); System.out.println(ar.age); System.out.println(ar.name); } } class Article { public int age; public String name; <span style="color:#ff6666;">public List<ArticleImage> articleimglist;</span> } class ArticleImage implements Serializable{ private static final long serialVersionUID = 6762300101092577096L; public String image; }</span>
可以看到本來是一個物件的陣列,但是我這裡確實"",空字串。所以導致出現了問題。
其實這個問題是實際中遇到的,原因是伺服器定義資料的時候不夠嚴謹,將陣列物件定義為空字串了。
<span style="font-size:18px;">String str = "{\"age\":23,\"name\":\"dsfds\", <span style="background-color: rgb(255, 102, 102);">\"articleimglist\":null</span>}";</span>
<span style="font-size:18px;">這樣子就可以了。</span>
總結:(1)碰到這個問題的時候,比較鬱悶,使用HiJson等解析工具沒有報錯。但是實際程式碼中總是報錯。(這個很坑,然自己一時沒有想明白)
(2)伺服器端的資料型別應該定義嚴謹一些,要不然很容易出現錯誤。
(3)Expected BEGIN_ARRAY but was STRING at line 1 column 45.以後碰到這種錯誤就大概知道是啥意思了。
找出這個問題的辦法也是,分解法,實際專案中資料量很大,分解成小例子,就趁成上述的。