日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用FastJson解析时有关内部类的两个问题

發布時間:2024/4/15 编程问答 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用FastJson解析时有关内部类的两个问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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數據,如下: {"rows" : [{"id" : 1}] } 如果我們使用下面的代碼去解析數據 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。 我們知道一個非靜態內部類,是不能直接進行實例化,如: Model.Data data = new Model.Data() 編譯會出錯,如果我們想實例化非靜態內部類,則必須要有一個外部類的實例,如: Model model = new Model(); Model.Data data = model.new Date(); 這樣就解釋了為什么上面的做法會出錯,因為FastJson解析數據時會直接創建內部類Data的實例。 正確的方式是將Data類單獨作為一個類,而不是內部類,如下: model類 public class Model {public Data data; } data類 public class Data {public List<Row> rows;public class Row{} }

?

總結

以上是生活随笔為你收集整理的使用FastJson解析时有关内部类的两个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。