當(dāng)前位置:
首頁 >
使用FastJson解析时有关内部类的两个问题
發(fā)布時(shí)間:2024/4/15
54
豆豆
生活随笔
收集整理的這篇文章主要介紹了
使用FastJson解析时有关内部类的两个问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、內(nèi)部類層次結(jié)構(gòu)不對(duì)
假設(shè)有一個(gè)model類,代碼如下: public class Model {public Data data;public class Data {public List<Row> rows;}public class Row{} } 注意雖然rows是Data的一個(gè)變量,但是類Row卻是與Data同一層次,都是Model類的內(nèi)部類。 這時(shí)如果需要解析的json如下: {"code":0,"data":{"pageSize":20,"rows":[{"id":13}]} } 使用FastJson進(jìn)行解析的時(shí)候就會(huì)報(bào)出如下錯(cuò)誤: 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的內(nèi)部類就會(huì)解決這一問題,代碼如下: public class Model {public Data data;public class Data {public List<Row> rows;public class Row{}} }?
2、直接用內(nèi)部類解析
同樣假設(shè)有一個(gè)model類,代碼如下: public class Model {public Data data;public class Data {public List<Row> rows;public class Row{}} }? 這時(shí)假設(shè)有一組Json數(shù)據(jù),如下: {"rows" : [{"id" : 1}] } 如果我們使用下面的代碼去解析數(shù)據(jù) Data data = JSON.parseObject(jsonStr, Data.class); 同樣會(huì)報(bào)錯(cuò): 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 這是因?yàn)橹苯邮褂昧藘?nèi)部類去解析json。 我們知道一個(gè)非靜態(tài)內(nèi)部類,是不能直接進(jìn)行實(shí)例化,如: Model.Data data = new Model.Data() 編譯會(huì)出錯(cuò),如果我們想實(shí)例化非靜態(tài)內(nèi)部類,則必須要有一個(gè)外部類的實(shí)例,如: Model model = new Model(); Model.Data data = model.new Date(); 這樣就解釋了為什么上面的做法會(huì)出錯(cuò),因?yàn)镕astJson解析數(shù)據(jù)時(shí)會(huì)直接創(chuàng)建內(nèi)部類Data的實(shí)例。 正確的方式是將Data類單獨(dú)作為一個(gè)類,而不是內(nèi)部類,如下: model類 public class Model {public Data data; } data類 public class Data {public List<Row> rows;public class Row{} }
?
總結(jié)
以上是生活随笔為你收集整理的使用FastJson解析时有关内部类的两个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义Toolbar的一些小技巧
- 下一篇: Android魔术(第五弹)—— 一步步