我被要求更改JacksonMap配置,以便我们(从JSON)反序列化的每个空对象都将被反序列化为null。
问题是我很难做到,但没有任何运气。下面是我们的ObjectMapper
配置的样本(和示例):
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true);
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
javaTimeModule.addDeserializer(Instant.class, InstantDeserializer.INSTANT);
mapper.registerModule(javaTimeModule);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
warmupMapper(mapper);
return mapper;
我想了一下,比如说:
mapper.configure(
DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
但它只对弦起作用。
我担心使用自定义反序列化器对我没有帮助,因为我正在编写一个通用的(针对所有对象)Map器,所以我可能需要一些类似于委托器或后处理反序列化方法的东西。
因此,对于像""
或{}
这样的json,我希望在java中转换为null
(而不是空字符串或Object
示例)。
4条答案
按热度按时间drkbr07n1#
空对象对你来说是什么?一个有空值字段的对象?一个没有字段的对象?你可以创建一个自定义来检查节点并按照你想要的方式反序列化。我认为以通用的方式使用它没有问题。
我举了一个小例子:
tzcvj98z2#
唯一的方法是使用自定义反序列化程序:
然后:
此解决方案由question上的Sach141提供。
s5a0g9ez3#
我也有同样的问题。
我有一个
City
类,有时我会从Web服务请求中收到'city':{}
。因此,标准序列化程序创建一个新的City,字段全部为空。
我以这种方式创建了一个自定义反序列化器
如果检查条件:
'city' : null
'city' : ''
'city' : '{}'
如果为真,则反串行化器返回
null
。qlfbtfca4#
另一种方法是使用
com.fasterxml.jackson.databind.util.Converter<IN,OUT>
,它本质上是反序列化的后处理器。假设我们有一个类:
现在假设我们想将一个空JSON对象
{}
反序列化为null
,而不是将id
和name
反序列化为null
值的Person
,我们可以创建以下Converter
:注意,我们必须处理空白
String
的情况,因为这是(与直觉相反)分配给JSON中没有给出的属性的默认值,而不是null
。给定转换器后,我们可以注解原始的
Person
类:这种方法的好处是您根本不必考虑或关心反序列化;你只需要决定在反序列化对象之后如何处理它,还有很多其他的转换你也可以用
Converter
来做,但是这很适合于使“空”值无效。