jackson 无法将字符串反序列化为java对象-无法构造'Address'的示例

wfypjpf4  于 2022-11-08  发布在  Java
关注(0)|答案(1)|浏览(171)

我有一个字符串,我应该把它读入一个地址对象。现在我得到的字符串可能包含一些额外的字段,可能不包含一些在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);
wtlkbnrh

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和一个无参数构造函数即可运行

相关问题