在進行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格式的數據,再進行解析。