在将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);ObjectMapper -
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;我尝试了这个问题中的建议,但对我的情况不起作用- link
发布于 2021-09-30 15:25:10
似乎只有“当输入包含显式的null值时(...)通常不会在缺少属性值的情况下使用”(reference documentation)才能工作,这与您的情况不同。
您的最佳选择是修改该映射属性的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()
}
}
}发布于 2021-10-01 09:56:01
作为João Dias already said,@JsonSetter(nulls = Nulls.AS_EMPTY)注释用于显式的null值。
如果不能更改ClassA,可以使用默认构造函数创建一个子类,将value2设置为空映射(假设ClassA有一个value2的设置器)。
class ClassAExtended extends ClassA {
public ClassAExtended() {
setValue2(new HashMap<>());
}
}您读取的变量仍然可以是ClassA类型
private final IonObjectMapper ionValueMapper;
ClassA classA = ionValueMapper.readValue(value, ClassAExtended.class);https://stackoverflow.com/questions/69393140
复制相似问题