作者:lily--妹妹 | 来源:互联网 | 2022-12-10 12:23
我使用com.fasterxml.jackson.databind.ObjectMapper类(com.fasterxml.jackson.core:jackson-databind:2.9.5)我试图反序列化以下类的对象:
class MyClass {
String name;
MyClass(String name) {
this.name = name;
}
}
我当前正在执行的代码如下:
MyClass myClass = new MyClass("test");
objectMapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
String text = objectMapper.writeValueAsString(myClass);
objectMapper.readValue(text, MyClass.class);
在最后一行失败并引发异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.pckge.MyClass
(尽管存在至少一个Creator)的实例:无法从[来源:(String)“ {” name“:” test“}”; 行:1,列:2]
我的目标是配置对象映射器,以便在MyClass的构造函数上不使用批注(例如JsonCreator或JsonProperties)的情况下成功反序列化对象:
这可行吗?
我缺少哪种配置?
非常感谢!
编辑1:@Dean的答复解决了此问题。但是,我也想避免使用默认构造函数。
1> steve..:
在没有默认构造函数的情况下解决此问题的正确方法是将JsonCreator和JsonProperty批注添加到类构造函数。
class MyClass {
String name;
@JsonCreator
MyClass(@JsonProperty("name") String name) {
this.name = name;
}
...
}
2> Dean..:
Jackson使用Getter和Setters来设置值。因此,您需要修改您的课程:
class MyClass {
String name;
MyClass(String name) {
this.name = name;
}
MyClass(){}
public void setName(String name) {
this.name = name;
}
public String getName(String name) {
return this.name;
}
}
不幸的是,它将需要默认的构造函数。