gpt4 book ai didi

java - Jackson - 反序列化期间不允许对象属性和数组元素为 null

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:58 24 4
gpt4 key购买 nike

Jackson 中是否有一个选项可以让反序列化在遇到 null 时失败对于任何(非原始)对象属性或任何(非原始)数组元素

它的工作方式应该与Deserialization Feature - FAIL_ON_NULL_FOR_PRIMITIVES类似。 )。

示例#1

所以反序列化{"name": null}反序列化为 POJO 时应抛出异常

class User { 
private String name = "Default name";
//+setters/getters
}

但是,它应该可以正常工作,并且在反序列化时不会抛出异常 {}到该 POJO 中,作为 name 的默认值字段不会被覆盖(请参阅注释)。

示例#2

我想避免null数组中的元素也如此,因此反序列化 ["A", "B", null]反序列化为 List<String> 时应抛出异常.

最佳答案

据我所知,没有简单的方法可以做到这一点(jackson-databind 2.4.2)。
我建议你看看使用custom constructors / factory methods用于从 Json 创建对象。这允许您对传入的 Json 字符串进行更高级的验证。

示例#1 的解决方案

您可以通过注册SimpleModule来添加此功能添加了 BeanDeserializerModifier为了改变反序列化功能。
通过覆盖适当的 method您可以使用默认的 JsonDeserializer轻松反序列化对象,并在出现 null 属性时引发映射异常。
您可以在类似SO question的答案中找到详细信息.

扩展现有的反序列化:

//instantiate an objectMapper and alter the deserialization functionality
ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
return new DisallowNullDeserializer(beanDesc.getBeanClass(), deserializer);
}
});
mapper.registerModule(simpleModule);

实际的反序列化和异常抛出发生在这个实用程序类中:

public class DisallowNullDeserializer<T> extends StdDeserializer<T> implements ResolvableDeserializer {
private final JsonDeserializer<?> delegateDeserializer;

public DisallowNullDeserializer(Class<T> clazz, JsonDeserializer<?> delegateDeserializer) {
super(clazz);
this.delegateDeserializer = delegateDeserializer;
}

@Override
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
// delegate actual deserialization to default deserializer
T out = (T) delegateDeserializer.deserialize(jp, ctxt);

// check for null properties & throw exception
// -> there may be a better, more performant way to find null properties
Map<String, Object> propertyMap = mapper.convertValue(out, Map.class);
for (Object property: propertyMap.values())
if (property == null)
throw ctxt.mappingException("Can not map JSON null values.");

return out;
}

// there is no obvious reason why this is needed; see linked SO answers
@Override
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
((ResolvableDeserializer) delegateDeserializer).resolve(ctxt);
}
}

关于java - Jackson - 反序列化期间不允许对象属性和数组元素为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692444/

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