首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >升级Jackson-databind后,缺少的字段被反序列化为null而不是空对象

升级Jackson-databind后,缺少的字段被反序列化为null而不是空对象
EN

Stack Overflow用户
提问于 2021-09-30 13:31:13
回答 2查看 205关注 0票数 0

在将Jackson库升级到2x版本后,我面临着一个问题,当字段在反序列化过程中从输入中丢失时,它们将被反序列化为null而不是空。

示例:

POJO

代码语言:javascript
复制
@Value
@Builder(builderClassName = "ClassABuilder")
@AllArgsConstructor
public class ClassA {
  private String value1;
  private Map<String, String> value2;

  private ClassA() {
    value1 = "someString";
    value2 = ImmutableList.of();
  }
}

反序列化-

代码语言:javascript
复制
private final IonObjectMapper ionValueMapper;
ionValueMapper.readValue(value, ClassA.class);

ObjectMapper -

代码语言:javascript
复制
IonObjectMapper joiObjectMapper = (IonObjectMapper) new IonObjectMapper()
                .setSerializationInclusion(JsonInclude.Include.ALWAYS)
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .enable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS)
                .enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, JsonTypeInfo.As.PROPERTY)
                .enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY)
                .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
                .enable(MapperFeature.AUTO_DETECT_SETTERS)
                .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
                .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
                .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
                .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE)
                .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);

输入-

代码语言:javascript
复制
{"value1" = "someString"}

所需输出-

代码语言:javascript
复制
{"value1" = "someString", "value2" = {}}

电流输出-

代码语言:javascript
复制
{"value1" = "someString", "value2" = null}

有没有一种方法可以在ObjectMapper中配置,使缺失的字段不应该转换为空而是空的?我不能更改ClassA。

我正在使用的Jackson包版本-

代码语言:javascript
复制
Jackson-core = 2.10.x;
Jackson-databind = 2.10.x;
Jackson-dataformat-xml = 2.10.x;
Jackson-module-jaxb-annotations = 2.10.x;
Jackson-dataformat-ion = 2.10.x;
Jackson-annotations = 2.10.x;

我尝试了这个问题中的建议,但对我的情况不起作用- link

EN

回答 2

Stack Overflow用户

发布于 2021-09-30 15:25:10

似乎只有“当输入包含显式的null值时(...)通常不会在缺少属性值的情况下使用”(reference documentation)才能工作,这与您的情况不同。

您的最佳选择是修改该映射属性的setter,如下所示:

代码语言:javascript
复制
@Value
@Builder(builderClassName = "ClassABuilder")
@AllArgsConstructor
public class ClassA {
    private String value1;
    private Map<String, String> value2;

    private ClassA() {
      value1 = "someString";
      value2 = ImmutableList.of();
    }

    public void setValue2(Map<String, String> value2) {
        if (value2 != null) {
            this.value2 = homes;
        } else {
            this.value2 = ImmutableList.of()
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-10-01 09:56:01

作为João Dias already said@JsonSetter(nulls = Nulls.AS_EMPTY)注释用于显式的null值。

如果不能更改ClassA,可以使用默认构造函数创建一个子类,将value2设置为空映射(假设ClassA有一个value2的设置器)。

代码语言:javascript
复制
class ClassAExtended extends ClassA {
    public ClassAExtended() {
        setValue2(new HashMap<>());     
    }
}

您读取的变量仍然可以是ClassA类型

代码语言:javascript
复制
private final IonObjectMapper ionValueMapper;
ClassA classA = ionValueMapper.readValue(value, ClassAExtended.class);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69393140

复制
相关文章

相似问题

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