java - 如何创建一个通用的 JsonDeserializer

标签 java jackson

我需要创建一个通用反序列化器;换句话说,我不知道反序列化的目标类是什么。

我在互联网上看到过示例,他们创建了一个反序列化器,例如 JsonDeserializer<Customer>然后返回 new Customer(...)在最后。问题是我不知道返回类是什么。

我想我需要使用反射来创建类的实例并填充字段。我怎样才能从反序列化方法做到这一点?

public class JsonApiDeserializer extends JsonDeserializer<Object> {

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

        //Need to parse the JSON and return a new instance here
    }

}

最佳答案

经过一些测试,我发现@jax的答案有问题。

正如@Staxman 指出的那样,createContextual() 是在构造反序列化器期间调用的,而不是在每个反序列化过程中都被调用。而 createContextual 返回的反序列化器将被 Jackson 库缓存。因此,如果您的反序列化器用于超过 1 种类型(例如公共(public)父类的子类型),它将抛出类型不匹配异常,因为 targetClass 属性将是 Jackson 库缓存的最后一个类型。

正确的解法应该是:

public class JsonApiDeserializer extends JsonDeserializer<Object> implements
        ContextualDeserializer {

    private Class<?> targetClass;

    public JsonApiDeserializer() {
    }

    public JsonApiDeserializer(Class<?> targetClass) {
        this.targetClass = targetClass;
    }

    @Override
    public Object deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        Object clazz = targetClass.newInstance();
        //Now I have an instance of the annotated class I can populate the fields via reflection
        return clazz;
    }

    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
            BeanProperty property) throws JsonMappingException {
        //gets the class type of the annotated class
        targetClass = ctxt.getContextualType().getRawClass();
        //this new JsonApiDeserializer will be cached
        return new JsonApiDeserializer(targetClass);
    }
}

关于java - 如何创建一个通用的 JsonDeserializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32565521/

相关文章:

Java:隐式类型转换,或隐式 toString() 调用

java - Spring 3 with Tiles 2.2.2 - 获取 "Servlet spring is currently unavailable"

java - 尝试重构得更好

java - 我希望当某些访问者加载链接(在帖子和页面上)时自动单击它

java - 如何转义 Jackson-dataformat-csv 库中的分隔符?

java - 如何在java中使用json数据/json响应创建pojo类?

java - Jackson 的 readEntity 正在将我的异常序列化为 java.lang.Throwable 而不是正确的错误异常

java - 使用 Java 获取 YouTube channel 订阅

java - 使用 Jackson 自定义反序列化 JSON 字段

java - 使用格式自定义反序列化日期