gpt4 book ai didi

java - 如何从 jackson 的自定义反序列化器中调用默认反序列化器

转载 作者:IT老高 更新时间:2023-10-28 11:39:34 25 4
gpt4 key购买 nike

我在 Jackson 的自定义解串器中有问题。我想访问默认序列化程序来填充我要反序列化的对象。在填充之后,我会做一些自定义的事情,但首先我想用默认的 Jackson 行为反序列化对象。

这是我目前拥有的代码。

public class UserEventDeserializer extends StdDeserializer<User> {

private static final long serialVersionUID = 7923585097068641765L;

public UserEventDeserializer() {
super(User.class);
}

@Override
@Transactional
public User deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {

ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
User deserializedUser = null;
deserializedUser = super.deserialize(jp, ctxt, new User());
// The previous line generates an exception java.lang.UnsupportedOperationException
// Because there is no implementation of the deserializer.
// I want a way to access the default spring deserializer for my User class.
// How can I do that?

//Special logic

return deserializedUser;
}

}

我需要的是一种初始化默认解串器的方法,这样我就可以在开始我的特殊逻辑之前预先填充我的 POJO。

当从自定义反序列化器中调用反序列化时,无论我如何构造序列化器类,似乎都是从当前上下文调用该方法。因为我的 POJO 中的注释。出于显而易见的原因,这会导致 Stack Overflow 异常。

我尝试过初始化一个BeanDeserializer,但是这个过程非常复杂,我还没有找到正确的方法来完成它。我也尝试过重载 AnnotationIntrospector 无济于事,认为它可能会帮助我忽略 DeserializerContext 中的注释。最后它接缝我可能已经使用 JsonDeserializerBuilders 取得了一些成功,尽管这需要我做一些神奇的事情来从 Spring 中获取应用程序上下文。我会很感激任何可以让我找到更清洁的解决方案的东西,例如如何在不阅读 JsonDeserializer 注释的情况下构造反序列化上下文。

最佳答案

正如 StaxMan 已经建议的那样,您可以通过编写 BeanDeserializerModifier 并通过 SimpleModule 注册它来做到这一点。以下示例应该可以工作:

public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer
{
private static final long serialVersionUID = 7923585097068641765L;

private final JsonDeserializer<?> defaultDeserializer;

public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer)
{
super(User.class);
this.defaultDeserializer = defaultDeserializer;
}

@Override public User deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt);

// Special logic

return deserializedUser;
}

// for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer
// otherwise deserializing throws JsonMappingException??
@Override public void resolve(DeserializationContext ctxt) throws JsonMappingException
{
((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
}


public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException
{
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier()
{
@Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer)
{
if (beanDesc.getBeanClass() == User.class)
return new UserEventDeserializer(deserializer);
return deserializer;
}
});


ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
User user = mapper.readValue(new File("test.json"), User.class);
}
}

关于java - 如何从 jackson 的自定义反序列化器中调用默认反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18313323/

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