目录
方案二:将内部类定义挪到外面定义(或直接定义成public的独立的java文件)
记录一次在使用FastJson反序列化内部类时遇到的问题。
-
错误信息如下:
com.alibaba.fastjson.JSONException: create instance error, class com.test.json.v0.Parent$Daughter
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:276)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:845)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:300)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:296)
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:86)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:857)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:300)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:296)
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:86)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:857)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:300)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:698)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:395)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:299)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:572)
at com.test.json.v0.JSONTest.testDeserialize(JSONTest.java:37)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:271)
... 42 more
-
导致如上错误的代码如下:
package com.test.json.v0;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Parent {
private String name;
private int age;
private Son son;
@Getter
@Setter
public class Son {
private String name;
private int height;
private Daughter daughter;
}
@Getter
@Setter
public class Daughter {
@JSONField(name = "name")
private String name;
}
}
-
测试代码如下:
package com.test.json.v0;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
public class JSONTest {
@Test
public void testSerialize() {
Parent p = new Parent();
p.setName("Tom");
p.setAge(120);
Parent.Son son = new Parent().new Son();
son.setName("Jerry");
son.setHeight(180);
p.setSon(son);
Parent.Daughter daughter = new Parent().new Daughter();
daughter.setName("Lisa");
daughter.setHobby("dancing");
son.setDaughter(daughter);
String person = JSON.toJSONString(p);
System.out.println(person);
}
/**
* 该方法会出现异常
*/
@Test
public void testDeserialize() {
System.out.println("--- testDeserialize ---");
String json = "{\"age\":120,\"name\":\"Tom\",\"son\":{\"daughter\":{\"name\":\"dancing\"},\"height\":180,\"name\":\"Jerry\"}}";
Parent person = JSON.parseObject(json, Parent.class);
System.out.println(JSON.toJSONString(person));
}
}
-
方案一:将内部类写成静态内部类,如下:
-
测试结果:
-
方案二:将内部类定义挪到外面定义(或直接定义成public的独立的java文件)
-
测试结果:
-
方案三:将内部类继续往里嵌套
-
测试结果: