Gson解析json時にExpected a string but was BEGIN_が現れるARRAY異常によりGsonとFastJsonの違いが発見された
3815 ワード
Gsonで1段のjsonを解析して、1つの属性をStringと定義して、すべてのデータ型を受信しようとして、解析したStringを手に入れてから処理して、結果はこの異常に遭遇した.
この異常はみんな出会ったことがあるはずです.私たちが定義したオブジェクトのある属性はstringタイプですが、jsonではArrayタイプです.
これは,Gsonではキーワードの後ろに「」が現れることによって引き起こされるコンテンツはSTRINGとしか考えられず,「{}」はクラスとしか考えられず,「[]」はリストとしか考えられず,これはほとんど強制的であるからである.
つまり、エンティティがStringの変数を取得すると予想されていますが、キーワードの後ろに対応する「{」または「[」が表示されると、この変換はエラーとみなされ、例外が放出されます.
以前使っていたFastJsonにはこのような問題は存在しないようだと思い、テストをしました.
この異常はみんな出会ったことがあるはずです.私たちが定義したオブジェクトのある属性はstringタイプですが、jsonではArrayタイプです.
これは,Gsonではキーワードの後ろに「」が現れることによって引き起こされるコンテンツはSTRINGとしか考えられず,「{}」はクラスとしか考えられず,「[]」はリストとしか考えられず,これはほとんど強制的であるからである.
つまり、エンティティがStringの変数を取得すると予想されていますが、キーワードの後ろに対応する「{」または「[」が表示されると、この変換はエラーとみなされ、例外が放出されます.
以前使っていたFastJsonにはこのような問題は存在しないようだと思い、テストをしました.
@Test
public void jsonTest(){
// json
File file=new File("C://data.json");
// String
String data=readToString(file.getAbsolutePath());
// fastjson
useFastJson(data);
// Gson
useGson(data);
}
/**
* fastjson
* @param data
*/
private void useFastJson(String data){
Article article= JSON.parseObject(data, Article.class);
System.out.println(article.getDetail());
}
/**
* Gosn
* @param data
*/
private void useGson(String data){
Article article= new Gson().fromJson(data,Article.class);
System.out.println(article.getDetail());
}
/**
* String
* @param fileName
* @return
*/
public static String readToString(String fileName) {
String encoding = "UTF-8";
File file = new File(fileName);
Long filelength = file.length();
byte[] filecontent = new byte[filelength.intValue()];
try {
FileInputStream in = new FileInputStream(file);
in.read(filecontent);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
return new String(filecontent, encoding);
} catch (UnsupportedEncodingException e) {
System.err.println("The OS does not support " + encoding);
e.printStackTrace();
return null;
}
}
:
[{"catalog":" ","article":[{"read":1,"column":9,"id":2,"title":"IntelliJIDEA ","slug":"static/kotlin_article/0_1.html"},{"read":1,"column":9,"id":3,"title":"Eclipse ","slug":"static/kotlin_article/0_2.html"},{"read":1,"column":9,"id":4,"title":" ","slug":"static/kotlin_article/0_3.html"},{"read":1,"column":9,"id":5,"title":"Android ","slug":"static/kotlin_article/0_4.html"}]}]
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 16 path $.detailcom.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 16 path $.detailat com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)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)at com.google.gson.Gson.fromJson(Gson.java:774)at per.wsj.myapplication.ExampleUnitTest.useGson(ExampleUnitTest.java:60)at per.wsj.myapplication.ExampleUnitTest.jsonTest(ExampleUnitTest.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)
Fastjson ,