java - jackson 反序列化缺少默认值

标签 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

最佳答案

@AllArgsConstructor 创建以下构造函数

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

构造函数用 @ConstructorProperties 注释,这意味着基于属性的创建者(参数获取构造函数或工厂方法)可用于实例化 JSON 对象的值,因此 jackson-databind 使用此构造函数来实例化来自 ExampleDto 类的对象。

当下面一行执行时

mapper.readValue("{\"name\": \"Foo\"}", ExampleDto.class);

因为在提供的 JSON 中没有 values 的值,所以在调用构造函数时为第二个参数传递 null

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

关于java - jackson 反序列化缺少默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725922/

相关文章:

Java Jsoup无法选择表

java - JFrame关闭操作

java - Jython:将脚本中的java类实例化为Java对象,而不是Python对象

java - 如何更改 Jackson 默认的具体 map 类型?

java - 使用关系和 @JsonIdentityInfo 进行 JSON 序列化

java - 从 JSON moxy 输出重命名 "type"

java - 在 jackson 中将格式错误的日期反序列化为空

java - HashMap 的奇怪序列化行为

java - Jackson 中的(反)序列化嵌套泛型

java - Jackson 自定义序列化以展平对象