杰克逊反序列化缺少的默认值

时间:2018-02-10 21:49:21

标签: java jackson deserialization json-deserialization lombok

我尝试使用以下代码反序列化我在API中收到的JSON对象:

ObjectMapper mapper = new ObjectMapper();
ExampleDto ed = mapper.readValue(req.body(), ExampleDto.class);

我的类使用Lombok生成构造函数,getter和setter,看起来像这样:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExampleDto {
    private String name = "";
    private List<String> values = new LinkedList<>();
}

两个属性都应该是可选的,如果未提供,则使用类定义中指定的默认值。但是,如果我现在尝试反序列化JSON

{name: "Foo"}

values字段为null。根据我的理解,以及我发现的所有示例代码,values应该是一个空列表。

编辑:不重复,因为我使用没有Optionals的Lombok

1 个答案:

答案 0 :(得分:3)

@AllArgsConstructor创建以下构造函数

@ConstructorProperties({"name", "values"})
ExampleDto(String name, List<String> values) {
    this.name = name;
    this.values = values;
}

构造函数用@ConstructorProperties注释,这意味着基于属性的创建者(参数构造函数或工厂方法)可用于实例化JSON对象中的值,因此jackson-databind使用此构造函数从{实例化对象{1}}上课。

执行以下行时

ExampleDto

因为提供的JSON中没有mapper.readValue("{\"name\": \"Foo\"}", ExampleDto.class); 的值,所以在调用构造函数时会为第二个参数传递values

如果删除null注释,jackson-databind将使用setter方法初始化对象,在这种情况下,@AllArgsConstructor将不是values