我使用org.codehaus.jackson.map.ObjectMapper
反序列化一个JSON字符串,默认值如下:
我有以下POJO:
@Data
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class CompanyRequest {
@Builder.Default
private String email = "";
private int company;
@Builder.Default
List<UserIdMapping> users = new ArrayList<>();
}
以及执行以下操作时:
CompanyRequest companyRequest = objectMapper.readValue(message, CompanyRequest.class);
其中消息为:
{
"email": "john@doe.com",
"company": 42,
}
它如预期的那样工作,意味着用users
将companyRequest
初始化为空ArrayList
。
然后我切换到com.fasterxml.jackson.databind.ObjectMapper
,但是相同的message
的users
是null
。
我可以通过以下更改解决该问题:
@Data
@EqualsAndHashCode
@Builder
public class CompanyRequest {
private String email;
private int company;
private List<UserIdMapping> users;
@JsonCreator
public CompanyRequest() {
this.email = "";
this.users = new ArrayList<>();
}
@Builder
public CompanyRequest(String email, int company, List<UserIdMapping> users) {
this.sfAccountId = StringUtils.isEmpty(email) ? "" : email;
this.company = company;
this.users = CollectionUtils.isEmpty(users) ? new ArrayList<>() : users;
}
}
但是在知道codehaus
实际上在没有这种操作的情况下也能正常工作之后,我想知道是否有更干净的方法来处理fasterxml
,因为fasterxml
是ObjectMapper
的更新版本,这意味着它是一个支持它的特性吗?
2条答案
按热度按时间zpjtge221#
“codehaus”版本的Jackson是1. x版本的Jackson,从2. 0开始,Jackson位于“com.fasterxml.jackson”,在没有测试过的情况下,很有可能行为只是简单地(并且是故意地)随着Jackson2而改变。
但是,正如您自己所发现的,您可以明确建议Jackson在反序列化时使用无参数构造函数。您还可以将该注解放在lombok生成的构造函数上,这样就不必手动编写它:
请确保至少使用Lombok v1.18.2,以便确保在此构造函数中也设置了
@Builder.Default
值。如果你希望不变性和构建器是创建示例的唯一方法(至少在Lombok v1.18.16中),考虑在类上放置
@Jacksonized @Builder
:ttygqcqt2#
使用lombok提供的@Jacksonized注解