Jackson:使用BeanDeserializerModifier进行基于接口/抽象类的反序列化

我需要反序列化JSON,但能够控制对象实例化。由于我需要查看JSON对象内容才能构造该对象,因此我使用了JsonDeserializerValueInstantiator无法重置解析器或将其替换为{{1 }},所以剩下一个自定义的TreeNode

现在的问题是,当我想使用默认的序列化程序反序列化到我创建的对象时,我得到一个异常,说JsonDeserializer无法反序列化到对象中。我正在反序列化具有getter和setter的接口/抽象类类型,例如

AbstractDeserializer

我不确定如何实现自己的需求。这是我使用的代码的草图

interface MyInterface {
  String getName();
  void setName(String name);
}

我要例外了

SimpleModule module = new SimpleModule();
objectMapper.registerModule(module);
module.setDeserializerModifier(new BeanDeserializerModifier() {
    @Override
    public JsonDeserializer<?> modifyDeserializer(Deserializationconfig config,BeanDescription beanDesc,JsonDeserializer<?> deserializer) {
        if (special.contains(beanDesc.getBeanClass())) {
            return new MyDeserializer(deserializer);
        }
        return deserializer;
    }
});


public class MyDeserializer extends JsonDeserializer {
    @Override
    public Object deserialize(JsonParser jsonParser,DeserializationContext deserializationContext) throws IOException,JsonProcessingException {
        ObjectCodec codec = jsonParser.getcodec();
        JsonNode treeNode = codec.readTree(jsonParser);
        JsonNode jsonNode = treeNode.get("someAttribute");
        Object reference = //...
        jsonParser = codec.treeAsTokens(treeNode);
        jsonParser.nextToken();
        return defaultDeserializer.deserialize(jsonParser,deserializationContext,reference);
    }
}
dzc361 回答:Jackson:使用BeanDeserializerModifier进行基于接口/抽象类的反序列化

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3147087.html

大家都在问