gpt4 book ai didi

java - 使用 TypeReference 的具有泛型类型的 JSON 反序列化器

转载 作者:行者123 更新时间:2023-12-04 13:43:13 53 4
gpt4 key购买 nike

我正在尝试推广这种方法:

public EventStream<Greeting> deserialize(String value){
ObjectMapper mapper = new ObjectMapper();

EventStream<Greeting> data = null;
try {
data = new ObjectMapper().readValue(value, new TypeReference<EventStream<Greeting>>() {});
} catch (IOException e) {
e.printStackTrace();
}
return data;
}

其中 EventStream 是:
public class EventStream<T> {

private EventHeaders headers;

@JsonDeserialize
private T payload;
}

我想要的是在反序列化方法中用泛型替换特定的对象问候语。

我试过这个:
public <T> EventStream<T> deserialize(String value){
ObjectMapper mapper = new ObjectMapper();

EventStream<T> data = null;
try {
data = new ObjectMapper().readValue(value, new TypeReference<EventStream<T>>() {});
} catch (IOException e) {
e.printStackTrace();
}
return data;
}

但是 EventStream 结果中的负载被反序列化为 LinkedHashMap。似乎 TypeReference 忽略了泛型类型。
任何的想法?
谢谢

最佳答案

您在这里遇到的是一个由称为类型删除的东西引起的常见问题,Java 实现泛型的方式。

Type erasure can be explained as the process of enforcing type constraints only at compile time and discarding the element type information at runtime. [1]



所以当你尝试反序列化你的对象时,类型 T 是未知的,它只是被视为 Object并且反序列化结果将默认为 Map ( LinkedHashMap 准确地说)。

您可以通过将 targetClass 作为附加参数传递给函数调用来使您的方法通用,如下所示:
public <T> EventStream<T> deserialize(String value, Class<T> targetClass)

然后使用映射器的 TypeFactory 创建此 targetClass 的类型
JavaType type = mapper.getTypeFactory().constructParametricType(EventStream.class, targetClass);

您可以将其传递给 readValue 方法:
data = mapper.readValue(value, type);

完整代码:
public <T> EventStream<T> deserialize(String value, Class<T> targetClass){
ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory()
.constructParametricType(EventStream.class, targetClass);
try {
return mapper.readValue(value, type);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

[1] https://www.baeldung.com/java-type-erasure

关于java - 使用 TypeReference 的具有泛型类型的 JSON 反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53748195/

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