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

前端之家收集整理的这篇文章主要介绍了使用FastJson解析时有关内部类的两个问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、内部类层次结构不对


@H_404_8@
假设有一个model类,代码如下:
public class Model {
    public Data data;
    public class Data {
        public List<Row> rows;
    }
    public class Row{
    }
}
@H_404_8@

@H_404_8@
注意虽然rows是Data的一个变量,但是类Row却是与Data同一层次,都是Model类的内部类。 @H_404_8@
这时如果需要解析的json如下: @H_404_8@
{ @H_404_8@
"code":0,@H_404_8@
"data":{ @H_404_8@
"pageSize":20,@H_404_8@ @H_404_8@
"rows":[ @H_404_8@
{ @H_404_8@
"id":13 @H_404_8@
} @H_404_8@
] @H_404_8@
} @H_404_8@
} @H_404_8@ @H_404_8@ @H_404_8@
使用FastJson进行解析的时候就会报出如下错误: @H_404_8@
Exception in thread "main" com.alibaba.fastjson.JSONException: create instance error,class com.example.testand.Model$Ds @H_404_8@
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:89) @H_404_8@
. @H_404_8@
. @H_404_8@
at com.example.testand.Demo.main(Demo.java:24) @H_404_8@
Caused by: java.lang.IllegalArgumentException: argument type mismatch @H_404_8@
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) @H_404_8@
. @H_404_8@
. @H_404_8@
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:86) @H_404_8@
... 16 more @H_404_8@ @H_404_8@
将Row改成Data的内部类就会解决这一问题,代码如下: @H_404_8@
public class Model {
    public Data data;
    public class Data {
        public List<Row> rows;
         public class Row{
        }
    }
}


@H_404_8@

@H_404_8@

@H_404_8@

2、直接用内部类解析


@H_404_8@
@H_404_8@
同样假设有一个model类,代码如下: @H_404_8@
@H_404_8@
public class Model {
    public Data data;
    public class Data {
        public List<Row> rows;
         public class Row{
        }
    }
}


@H_404_8@ @H_404_8@
这时假设有一组Json数据,如下: @H_404_8@
{ @H_404_8@
"rows" : [ @H_404_8@
{ @H_404_8@
"id" : 1 @H_404_8@
} @H_404_8@
] @H_404_8@
} @H_404_8@ @H_404_8@
如果我们使用下面的代码去解析数据 @H_404_8@
Data data = JSON.parSEObject(jsonStr,Data.class); @H_404_8@
同样会报错: @H_404_8@
404_8@
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:89) @H_404_8@
. @H_404_8@
. @H_404_8@
at com.example.testand.Demo.main(Demo.java:25) @H_404_8@
Caused by: java.lang.NullPointerException @H_404_8@
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:86) @H_404_8@
... 7 more @H_404_8@ @H_404_8@
这是因为直接使用了内部类去解析json。 @H_404_8@
我们知道一个非静态内部类,是不能直接进行实例化,如: @H_404_8@
Model.Data data = new Model.Data() @H_404_8@
编译会出错,如果我们想实例化非静态内部类,则必须要有一个外部类的实例,如: @H_404_8@
Model model = new Model(); @H_404_8@
Model.Data data = model.new Date(); @H_404_8@ @H_404_8@
这样就解释了为什么上面的做法会出错,因为FastJson解析数据时会直接创建内部类Data的实例。 @H_404_8@
正确的方式是将Data类单独作为一个类,而不是内部类,如下: @H_404_8@
model类 @H_404_8@
public class Model {
    public Data data;
}
@H_404_8@
data类 @H_404_8@
public class Data {
     public List<Row> rows;
     public class Row{
     }
}
@H_404_8@

猜你在找的Json相关文章