使用FastJson解析时有关内部类的两个问题
生活随笔
收集整理的這篇文章主要介紹了
使用FastJson解析时有关内部类的两个问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、內部類層次結構不對
假設有一個model類,代碼如下: public class Model {public Data data;public class Data {public List<Row> rows;}public class Row{} } 注意雖然rows是Data的一個變量,但是類Row卻是與Data同一層次,都是Model類的內部類。 這時如果需要解析的json如下: {"code":0,"data":{"pageSize":20,"rows":[{"id":13}]} } 使用FastJson進行解析的時候就會報出如下錯誤: Exception in thread "main" com.alibaba.fastjson.JSONException: create instance error, class com.example.testand.Model$Ds at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:89) . . at com.example.testand.Demo.main(Demo.java:24) Caused by: java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) . . at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:86) ... 16 more 將Row改成Data的內部類就會解決這一問題,代碼如下: public class Model {public Data data;public class Data {public List<Row> rows;public class Row{}} }?
2、直接用內部類解析
同樣假設有一個model類,代碼如下: public class Model {public Data data;public class Data {public List<Row> rows;public class Row{}} }? 這時假設有一組Json數(shù)據(jù),如下: {"rows" : [{"id" : 1}] } 如果我們使用下面的代碼去解析數(shù)據(jù) Data data = JSON.parseObject(jsonStr, Data.class); 同樣會報錯: Exception in thread "main" com.alibaba.fastjson.JSONException: create instance error, class com.example.testand.Model$Data at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:89) . . at com.example.testand.Demo.main(Demo.java:25) Caused by: java.lang.NullPointerException at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:86) ... 7 more 這是因為直接使用了內部類去解析json。 我們知道一個非靜態(tài)內部類,是不能直接進行實例化,如: Model.Data data = new Model.Data() 編譯會出錯,如果我們想實例化非靜態(tài)內部類,則必須要有一個外部類的實例,如: Model model = new Model(); Model.Data data = model.new Date(); 這樣就解釋了為什么上面的做法會出錯,因為FastJson解析數(shù)據(jù)時會直接創(chuàng)建內部類Data的實例。 正確的方式是將Data類單獨作為一個類,而不是內部類,如下: model類 public class Model {public Data data; } data類 public class Data {public List<Row> rows;public class Row{} }
?
總結
以上是生活随笔為你收集整理的使用FastJson解析时有关内部类的两个问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义Toolbar的一些小技巧
- 下一篇: Android魔术(第五弹)—— 一步步