gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:02:24 25 4
gpt4 key购买 nike

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

我在互联网上看到过示例,他们创建了一个反序列化器,例如 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/

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