色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

gson解析非json格式數據報錯

錢良釵1年前8瀏覽0評論

在進行Android開發(fā)中,很常見使用Gson庫對JSON格式數據進行解析。但是,在實際開發(fā)中我們可能會遇到非JSON格式的數據需要進行解析,此時如果使用Gson庫進行解析,就會出現報錯的情況。

比如,當我們要解析的數據格式類似下面這種:

{
"name":"Tom",
"age":"18",
"sex":"male"
}

其中,數據鍵值對之間使用的是英文雙引號,符合JSON數據格式的規(guī)范。但是,如果數據格式類似下面這種:

name:Tom
age:18
sex:male

其中,數據鍵值對之間使用的是冒號,而不是英文雙引號,這種數據格式并不符合JSON數據格式的規(guī)范。

在這種情況下,如果我們直接使用Gson庫進行解析,就會出現報錯,下面是錯誤信息:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
	at com.google.gson.Gson.fromJson(Gson.java:888)
	at com.google.gson.Gson.fromJson(Gson.java:853)
	at com.google.gson.Gson.fromJson(Gson.java:802)

其中,報錯的關鍵信息是"Expected BEGIN_OBJECT but was STRING",意思是期望的數據類型是對象類型(BEGIN_OBJECT),但實際上讀到的是字符串類型(STRING)。

解決這個問題的方法很簡單,只需要使用Gson庫中的JsonParser類將字符串類型的數據轉換成JSON對象類型的數據即可。

String data = "name:Tom\nage:18\nsex:male";
JsonParser parser = new JsonParser();
JsonObject obj = (JsonObject)parser.parse(data.replace("\n","").replaceAll(":","\":\"").replaceAll(",","\",\""));
String name = obj.get("name").getAsString();
int age = obj.get("age").getAsInt();
String sex = obj.get("sex").getAsString();

在上面的代碼中,我們使用了replace()方法將數據中的換行符去掉,使用replaceAll()方法將冒號替換成英文雙引號,將逗號替換成逗號和雙引號的組合,從而得到符合JSON格式的字符串。然后我們再使用JsonParser類將該字符串轉換成JSON對象類型的數據,最后通過鍵名獲取對應的值。

總結:

Gson庫只能解析符合JSON數據格式規(guī)范的數據,如果要解析非JSON格式的數據,需要先將數據轉換成JSON格式的數據,再進行解析。