我有一个字符串,我应该把它读入一个地址对象。现在我得到的字符串可能包含一些额外的字段,可能不包含一些在Address类中声明的字段。
我已经在地址类上添加了以下注解-
@JsonInclude(NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Address {
private String line1;
private String line2;
private String state;
private String pincode;
......
}
但是,当反序列化一个字符串时,如{“street”:“street”,“line 1”:“line 1”,“line 2”:“line 2”,“district”:“district”,“pincode”:“pincode”},得到这个错误-
java.lang.IllegalArgumentException: Cannot construct instance of `Address` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"street":"street","line1":"line1","line2":"line2","district":"district","pincode":"pincode"}')
at [Source: UNKNOWN; line: -1, column: -1]
已将以下配置添加到我对象Map器-
如果您的配置文件中包含一个对象Map器,则该对象Map器将被禁用。如果您的配置文件中包含一个对象Map器,那么您可以使用该对象Map器来创建一个对象Map器。如果您有一个对象Map器,那么您可以使用它来创建一个对象Map器。
转换逻辑-
String addressDetail = info.get("address");
Address address = objectMapper.convertValue(addressDetail, Address.class);
1条答案
按热度按时间wtlkbnrh1#
您遇到的错误基于objectmapper convertvalue-vs-readvalue。
基本上,
objectMapper.convertValue(addressDetail, Address.class)
尝试的是从传入的单个字符串值创建一个Address
。它不读取字符串内容和设置字段值。如果需要使用convertValue
,则必须创建一个类似public Address(String json){/*do mapping manually here*/}
的构造函数。但是,更好的方法是使用
objectMapper.readValue(addressDetail, Address.class)
,因为此方法实际上遍历JSON字符串,并使用字符串中的字段创建一个示例。readValue
只需要getter/setter和一个无参数构造函数即可运行