缺失字段在升级jackson - databbinding后被反序列化为null而不是空对象



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

,

POJO

@Value
@Builder(builderClassName = "ClassABuilder")
@AllArgsConstructor
public class ClassA {
private String value1;
private Map<String, String> value2;
private ClassA() {
value1 = "someString";
value2 = ImmutableList.of();
}
}

反序列化,

private final IonObjectMapper ionValueMapper;
ionValueMapper.readValue(value, ClassA.class);

objectmap——

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);

输入——

{"value1" = "someString"}

期望输出-

{"value1" = "someString", "value2" = {}}

电流输出-

{"value1" = "someString", "value2" = null}

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

我正在使用的Jackson软件包版本-

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;

我尝试了这个问题的建议,但不适合我的情况-链接

似乎@JsonSetter(nulls = Nulls.AS_EMPTY)只工作";当输入包含明确的null值(…)通常不使用在情况下,属性值丢失";(参考文档)这不是你的情况。

最好的选择是修改map属性的setter,如下所示:

@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()
}
}
}

正如joo Dias已经说过的,@JsonSetter(nulls = Nulls.AS_EMPTY)注释是指显式的null值。

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

class ClassAExtended extends ClassA {
public ClassAExtended() {
setValue2(new HashMap<>());     
}
}

类型的变量你读来仍然可以ClassA:

private final IonObjectMapper ionValueMapper;
ClassA classA = ionValueMapper.readValue(value, ClassAExtended.class);

最新更新