我在杰克逊的自定义解串器有问题。我想访问默认序列化器来填充我要反序列化的对象。在填充之后,我将做一些自定义的事情,但首先我想使用默认的 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中的注释。由于显而易见的原因,这会导致堆栈溢出异常。
我尝试过初始化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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)