gpt4 book ai didi

java - 为什么左侧的类型被忽略 - Jackson 反序列化

转载 作者:行者123 更新时间:2023-12-02 04:16:04 24 4
gpt4 key购买 nike

我有一个像这样的POJO

class POJO {
Map<Integer, Integer> map;
//Getter and Setter for map here
}

我有一个 json(POJO 列表)

[
{
"200": 10
},
{
"20": 100,
"30": 400
}
]

在 jackson 反序列化期间如果我这样做

String s = ... //s has the above json
List<POJO> pojoList = mapper.readValue(s, new TypeReference<List<POJO>>() {});
System.out.println(pojoList.get(0).getMap().get(20)); //prints 100

那就没有问题了

但是如果我使用像这样的通用列表

List<POJO> pojoList = mapper.readValue(s, List.class);

然后在System.out.println中抛出ClassCastException

java.util.LinkedHashMap cannot be cast to mycode.model.POJO
<小时/>

我明白,如果我只是告诉 Jackson List ,它会将每个对象反序列化为 Map 而不是 POJO 类型。因此,当我尝试访问 pojoList.get(0).getMap() 时,它会抛出异常

(注意:打印 pojoList.get(0) 没有问题并打印 {"200":10})

我的问题是为什么它在反序列化本身期间没有抛出异常。 LHS 上的对象类型是否被忽略?

谢谢..

最佳答案

My question is why didn't it throw exception during deserialization itself. Did the type of object on LHS ignored?

您对 Java 的工作原理存在误解。这两条语句的运行时评估

List<POJO> pojoList = mapper.readValue(s, List.class);
mapper.readValue(s, List.class);

完全一样。换句话说,分配的变量在运行时不起作用。在编译时,它的所有好处就是可能为泛型和 poly expressions 提供上下文。 .

当你调用你的

mapper.readValue(s, List.class);

您告诉 Jackson 将 JSON 反序列化为 List 。就是这样。你没有给它任何其他信息。 Jackson 绝对不可能猜到你指的是 POJO 的列表。或其他任何东西。因此, jackson 猜测并使用自己的默认值。对于 JSON 对象,默认值为 LinkedHashMap

更重要的是,List.class计算结果为 Class<List>因此您的 readValue 的返回类型是原始的List类型。使用原始类型时,泛型将被删除。因此,您不会收到编译错误,但应该收到有关未经检查的转换的警告。

你应该阅读

<小时/>

另一方面,这个

List<POJO> pojoList = mapper.readValue(s, new TypeReference<List<POJO>>() {});

之所以有效,是因为您向 Jackson 提供了正确反序列化 JSON 所需的所有信息。这是List (JSON 数组)为 POJO元素(JSON 对象)。

然而,这也有其自身的问题。 readValue 的返回类型(即编译时)从上下文(我之前提到的)推断出来并绑定(bind)到 List<POJO>因为这是您将结果分配给的表达式的类型。 TypeReference此处不提供泛型的类型信息。因此,您可以执行类似的操作

List<String> stringList = mapper.readValue(s, new TypeReference<List<POJO>>() {}); 

编译时不会出现错误。但在运行时,一切都可能会崩溃。

关于java - 为什么左侧的类型被忽略 - Jackson 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307611/

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