杰克逊反序列化缺少默认值
Jackson deserialize default values missing
我尝试使用以下代码反序列化我在 API 中收到的 JSON 对象:
ObjectMapper mapper = new ObjectMapper();
ExampleDto ed = mapper.readValue(req.body(), ExampleDto.class);
我的 class 使用 Lombok 生成构造函数、getter 和 setter,如下所示:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExampleDto {
private String name = "";
private List<String> values = new LinkedList<>();
}
这两个属性都应该是可选的,如果未提供,则使用 class 定义中指定的默认值。但是,如果我现在尝试反序列化 JSON
{name: "Foo"}
values
字段是 null
。根据我的理解以及我发现的所有示例代码,values
应该是一个空列表。
编辑:不是重复的,因为我使用的是没有 Optionals 的 Lombok
@AllArgsConstructor
创建以下构造函数
@ConstructorProperties({"name", "values"})
ExampleDto(String name, List<String> values) {
this.name = name;
this.values = values;
}
构造函数用 @ConstructorProperties
注释,这意味着基于 属性 的创建者(参数获取构造函数或工厂方法)可用于从 JSON 对象实例化值,因此 jackson- databind 使用此构造函数从 ExampleDto
class.
实例化一个对象
当下面一行执行时
mapper.readValue("{\"name\": \"Foo\"}", ExampleDto.class);
因为提供的 JSON 中没有 values
的值,所以在调用构造函数时将 null
传递给第二个参数。
如果删除 @AllArgsConstructor
注释 jackson-databind 将使用 setter 方法来初始化对象,在这种情况下 values
将不会是 null
我尝试使用以下代码反序列化我在 API 中收到的 JSON 对象:
ObjectMapper mapper = new ObjectMapper();
ExampleDto ed = mapper.readValue(req.body(), ExampleDto.class);
我的 class 使用 Lombok 生成构造函数、getter 和 setter,如下所示:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExampleDto {
private String name = "";
private List<String> values = new LinkedList<>();
}
这两个属性都应该是可选的,如果未提供,则使用 class 定义中指定的默认值。但是,如果我现在尝试反序列化 JSON
{name: "Foo"}
values
字段是 null
。根据我的理解以及我发现的所有示例代码,values
应该是一个空列表。
编辑:不是重复的,因为我使用的是没有 Optionals 的 Lombok
@AllArgsConstructor
创建以下构造函数
@ConstructorProperties({"name", "values"})
ExampleDto(String name, List<String> values) {
this.name = name;
this.values = values;
}
构造函数用 @ConstructorProperties
注释,这意味着基于 属性 的创建者(参数获取构造函数或工厂方法)可用于从 JSON 对象实例化值,因此 jackson- databind 使用此构造函数从 ExampleDto
class.
当下面一行执行时
mapper.readValue("{\"name\": \"Foo\"}", ExampleDto.class);
因为提供的 JSON 中没有 values
的值,所以在调用构造函数时将 null
传递给第二个参数。
如果删除 @AllArgsConstructor
注释 jackson-databind 将使用 setter 方法来初始化对象,在这种情况下 values
将不会是 null