首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson-databind将缺少属性的JSON反序列化为"null“,而不是默认值。

Jackson-databind将缺少属性的JSON反序列化为"null“,而不是默认值。
EN

Stack Overflow用户
提问于 2022-06-27 17:03:13
回答 1查看 260关注 0票数 2

当反序列化JSON字符串时,丢失的属性在不应该是"null“时被设置为”null“。下面是一个POJO类:

代码语言:javascript
复制
    @Builder
    @Getter
    @Setter
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @EqualsAndHashCode
    static class MyPojo {
        
        @JsonProperty(value = "OptionalProp", required = false, defaultValue = "")
        @Builder.Default
        @Nullable
        @JsonSetter(value = "", nulls = Nulls.AS_EMPTY)
        private String optionalProp = "";
    
        @JsonProperty(value = "RequiredProp", required = false, defaultValue = "")
        @Builder.Default
        @Nullable
        @JsonSetter(value = "", nulls = Nulls.AS_EMPTY)
        private String requiredProp = "";
    }

用于反序列化的JSON字符串:

代码语言:javascript
复制
{
  "RequiredProp" : "test"
}

下面是反序列化:

代码语言:javascript
复制
private final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private final myPojo = OBJECT_MAPPER.readValue(inputStream, MyPojo.class);

这是输出:

代码语言:javascript
复制
MyPojo(optionalProp=null, requiredProp=test)

但是使用构建器创建POJO:

代码语言:javascript
复制
        final MyPojo myPojo = MyPojo.builder()
            .requiredProp("test")
            .build();

其结果如下:

代码语言:javascript
复制
MyPojo(optionalProp=, requiredProp=test)

我在用:

代码语言:javascript
复制
Jackson-databind 2.12.x
Jackson-annotation 2.12.x
Jackson-core 2.12.x

是否有从这些包中更改行为的小版本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-27 21:20:27

问题来源于隆布克,而不是杰克逊的东西。看一看生成的源代码,您就可以清楚地了解正在发生的事情。使用Builder.Default似乎会导致这个问题,因为它显然会产生混乱的代码,从而删除您已经准备好的初始化。删除注释将恢复正确的行为。

这似乎是Lombok的一个问题,并被记录为这里。删除注释应该会导致正确的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72775857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档