1. 程式人生 > >Gson解析出現類似錯誤,com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_AR

Gson解析出現類似錯誤,com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_AR

<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.以後碰到這種錯誤就大概知道是啥意思了。

                      找出這個問題的辦法也是,分解法,實際專案中資料量很大,分解成小例子,就趁成上述的。