gpt4 book ai didi

jackson - 如何使用 Jackson BeanDeserializerModifier?

转载 作者:行者123 更新时间:2023-12-04 03:02:04 31 4
gpt4 key购买 nike

我正在尝试实现自定义解串器。因为我只想向默认反序列化器添加功能,所以我尝试在我的自定义反序列化器中存储默认反序列化器:我想使用默认反序列化 json,然后添加其他信息。

我正在尝试使用 BeanDeserializerModifier 来注册自定义反序列化器。

SimpleModule module = new SimpleModule("ModelModule", Version.unknownVersion());

module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
JsonDeserializer<?> configuredDeserializer = super.modifyDeserializer(config, beanDesc, deserializer);
if (Document.class.isAssignableFrom(beanDesc.getBeanClass())) {
logger.debug("Returning custom deserializer for documents");

configuredDeserializer = new DocumentDeserializer(configuredDeserializer, (Class<Document>)beanDesc.getBeanClass());
}

return configuredDeserializer;
}
});

如您所见,如果要生成的对象是“文档”,我正在修改返回自定义反序列化器的反序列化器。我将默认反序列化器传递给构造函数,以便稍后使用它。

当我尝试反序列化时,Jackson 失败并出现错误:

No _valueDeserializer assigned(..)

我已经调查过,似乎默认反序列化器没有针对其属性的正确反序列化器:对于所有属性,它使用的反序列化器 FailingDeserializer 当然会失败并返回上述错误。这个反序列化器应该被替换,但它没有。

看来,Jackson在调用modifyDeserializer方法后,就完成了配置。

我使用的自定义解串器是:

@SuppressWarnings("serial")
public class DocumentDeserializer extends StdDeserializer<Document> {
private JsonDeserializer<?> defaultDeserializer;
private DocumentDeserializer(JsonDeserializer<?> defaultDeserializer, Class<? extends Document> clazz) {
super(clazz);
this.defaultDeserializer = defaultDeserializer;
}

@Override
public Document deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Document documentDeserialized = (Document) defaultDeserializer.deserialize(jp, ctxt);
/* I want to modify the documentDeserialized before returning it */
return documentDeserialized;
}
}

更新:我使用不同的反序列化器解决了这个问题:

public class CustomDeserializerModifier extends BeanDeserializerModifier {
private static final Logger logger = Logger.getLogger(CustomDeserializerModifier.class);

public CustomDeserializerModifier (Factory factory) {
this.factory = factory;
}

@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
JsonDeserializer<?> configuredDeserializer;
if (CustomDeserializedNode.class.isAssignableFrom(beanDesc.getBeanClass())) {
Converter<Object, Object> conv = beanDesc.findDeserializationConverter();
JavaType delegateType = conv.getInputType(config.getTypeFactory());
configuredDeserializer = new CustomDeserializedNodeDeserializer(conv, delegateType, (JsonDeserializer<Document>) deserializer,
(Class<? extends CustomDocument<?>>)beanDesc.getBeanClass());
} else {
configuredDeserializer = super.modifyDeserializer(config, beanDesc, deserializer);
}

return configuredDeserializer;
}

@SuppressWarnings("serial")
public class CustomDeserializedNodeDeserializer extends StdDelegatingDeserializer<Object> {
private Class<? extends CustomDocument<?>> beanClass;
public CustomDeserializedNodeDeserializer(Converter<Object,Object> converter,
JavaType delegateType, JsonDeserializer<Document> delegateDeserializer, Class<? extends CustomDocument<?>> beanClass) {
super(converter, delegateType, delegateDeserializer);
this.beanClass = beanClass;
}

@Override
public CustomDeserializedNode deserialize(JsonParser jp, DeserializationContext ctxt)

throws IOException, JsonProcessingException {
CustomDeserializedNode node = (CustomDeserializedNode)factory.createCustomDocument(beanClass);
CustomDeserializedNode documentDeserialized = (Document) super.deserialize(jp, ctxt, node);

return documentDeserialized;
}
}

}

可能扩展 StdDelegatingDeserializer 会执行@StaxMan 的建议。

最佳答案

这应该添加到FAQ中,但是你需要做的是实现2个接口(interface):

  • ResolvableDeserializer(方法resolve(...))
  • ContextualDeserializer(方法createContextual(...))

并将这些调用委托(delegate)给 defaultDeserializer,以防它实现一个或两个接口(interface)。这些是解串器初始化所必需的;特别是 ContextualDeserializer,通过它属性注释可用于反序列化器。并且 ResolvableDeserializerBeanDeserializer 用来获取它拥有的属性的反序列化器,如果有的话;这是可能获取相关 _valueDeserializer 的地方。

关于jackson - 如何使用 Jackson BeanDeserializerModifier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48390287/

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