Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当没有默认构造函数时,反序列化失败_Java_Deserialization_Fastjson - Fatal编程技术网

Java 当没有默认构造函数时,反序列化失败

Java 当没有默认构造函数时,反序列化失败,java,deserialization,fastjson,Java,Deserialization,Fastjson,我正在尝试使用Fastjson库进行JSON序列化。 当我尝试反序列化时,它没有显示默认构造函数错误。 注意:我这里的课是一个玩具的例子。实际上,它包含了很多对其他maven项目中的其他类的引用,实际上不可能修改每个类 这是代码 Student s = new Student("vineel", "20"); String hell = JSON.toJSONString(s); Student model2 = JSON.parseObject(hell, Student.class); Sy

我正在尝试使用Fastjson库进行JSON序列化。 当我尝试反序列化时,它没有显示默认构造函数错误。 注意:我这里的课是一个玩具的例子。实际上,它包含了很多对其他maven项目中的其他类的引用,实际上不可能修改每个类

这是代码

Student s = new Student("vineel", "20");
String hell = JSON.toJSONString(s);
Student model2 = JSON.parseObject(hell, Student.class);
System.out.println(model2);

public class Student {

private String name;
private String age;
Student(String name,String age){
this.name = name;
this.age = age;
}
@override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}

}
错误如下:

Exception in thread "main" com.alibaba.fastjson.JSONException: default constructor not found. class com.alibaba.fastjson.Student
at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:467)
at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:213)
at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:656)
at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:573)
at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:386)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:658)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:365)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:269)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:488)
at com.alibaba.fastjson.JSON.main(JSON.java:1068)
因此,创建一个TO类

Student model2 = JSON.parseObject(hell, StudentTO.class).asStudent();
System.out.println(model2);

public class StudentTO {

    private String name;
    private String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public Student asStudent() {
        return new Student(name, age);
    }
}
将构造函数更改为

@JsonCreator
public Student(@JsonProperty("name") String name, @JsonProperty("age") String age){
    this.name = name;
    this.age = age;
}

是的,的确如此。如果不想在其他地方使用默认构造函数,可以将其设置为私有。因此,请添加默认构造函数。这是不可能的@daniuNot capable???为什么?我试图反序列化的类依赖于这么多库,我不想在任何地方都添加默认构造函数,这实际上是不可能的。如果你必须复制每个可序列化类,只需在每个类中添加另一个构造函数就更容易了…@JaroslawPawlak当然,但这个建议已经得到了满足“我不想“。在我的实际类中有很多引用。我不能去每一个图书馆,不断修改每一个需要完成的类。我正在寻找一个解决方案,在这个解决方案中,我们可以配置etc并完成反序列化。@user4654也许您应该寻找其他允许配置它的json serialiser
gson
jackson
是最流行的两个,但我不记得它们是否可以配置为不需要默认构造函数。@JaroslawPawlak此库的性能要好得多。这对我要解决的问题非常重要。