gpt4 book ai didi

java - 启用 Jackson 将空对象反序列化为 Null

转载 作者:行者123 更新时间:2023-12-01 13:20:34 24 4
gpt4 key购买 nike

我被要求更改我们的 jackson 映射配置,以便我们反序列化(来自 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);
但它只适用于字符串。
恐怕使用自定义反序列化器对我没有帮助,因为我正在编写一个通用(适用于所有对象)映射器。所以我可能需要像委托(delegate)人或后处理反序列化方法这样的东西。
所以对于像 "" 这样的 json或 {}我希望转换为 null在 java 中(而不是空字符串或 Object 实例)。

最佳答案

对你来说什么是空对象?具有空值字段的对象?没有字段的对象?您可以创建一个自定义来检查节点并反序列化您想要的方式。我认为以通用方式使用它没有问题。

我做了一个小例子:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import java.util.Objects;

public class DeserializerExample<T> extends StdDeserializer<T> {

private final ObjectMapper defaultMapper;

public DeserializerExample(Class<T> clazz) {
super(clazz);
defaultMapper = new ObjectMapper();
}

@Override
public T deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
System.out.println("Deserializing...");

JsonNode node = jp.getCodec().readTree(jp);

for (JsonNode jsonNode : node) {
if (!jsonNode.isNull()) {
return defaultMapper.treeToValue(node, (Class<T>) getValueClass());
}
}

return null;
}

public static void main(String[] args) throws IOException {

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Person.class, new DeserializerExample(Person.class));
mapper.registerModule(module);

Person person = mapper.readValue("{\"id\":1, \"name\":\"Joseph\"}", Person.class);

Person nullPerson = mapper.readValue("{\"id\":null, \"name\":null}", Person.class);

System.out.println("Is null: " + Objects.isNull(person));
System.out.println("Is null: " + Objects.isNull(nullPerson));
}

}

关于java - 启用 Jackson 将空对象反序列化为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57464489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com