gpt4 book ai didi

java - 通用方法和 JSON

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:29 24 4
gpt4 key购买 nike

我编写了通用方法,它返回一些对象的列表,例如订单。我的问题是为什么在第二个非通用方法中它返回正确的订单列表,而第一个方法(通用)返回 linkedHashMaps 列表而不是订单?

通用:

 private <T> List<T> mapObjectsToList(String objectsListInJson) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
TypeReference<List<T>> mapType = new TypeReference<List<T>>() {
};
return objectMapper.readValue(objectsListInJson, mapType);
}

非通用:

private List<Order> mapObjectsToList(String objectsListInJson) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
TypeReference<List<Order>> mapType = new TypeReference<List<Order>>() {
};
return objectMapper.readValue(objectsListInJson, mapType);
}

通用方法返回: LinkedHashMap

最佳答案

问题在于泛型类型变量 T 未绑定(bind)到任何具体类型,因此编译器将其视为 Object。所以:

TypeReference<List<T>> mapType = new TypeReference<List<T>>() {};

实际上是:

TypeReference<List<Object>> mapType = new TypeReference<List<Object>>() {};

ObjectMapper无法收集有关要反序列化的对象的具体类型的信息时,它默认为LinkedHashMap

如果您希望能够在运行时反序列化为泛型类型,则应将 TypeReference 类型标记作为参数传递给 mapObjectsToList 方法:

// Make this a singleton, i.e. don't create a new instance on every call!
ObjectMapper objectMapper = new ObjectMapper();

private <T> List<T> mapObjectsToList(
String objectsListInJson,
TypeReference<List<T>> mapType) throws IOException {

return objectMapper.readValue(objectsListInJson, mapType);
}

然后使用上面的方法如下:

List<Order> orders = mapObjectsToList(
stringWithTheJSON,
new TypeReference<List<Order>> {});

顺便说一句,我已将 ObjectMapper objectMapper = new ObjectMapper() 语句移到了方法之外。整个应用程序中应该只有一个 ObjectMapper 实例,除非您需要不同的配置来进行序列化/反序列化。

关于java - 通用方法和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44424306/

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