Jackson是一个广泛使用的 Java 库,它允许我们方便地序列化/反序列化 JSON 或 XML。
有时,当我们尝试将 JSON 或 XML 反序列化为对象集合时,可能会遇到” java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to X “。
在本教程中,我们将讨论为什么会发生上述异常以及如何解决该问题。
让我们创建一个简单的 Java 应用程序来重现此异常,以了解异常何时发生。
2.1 创建 POJO 类
5.使用 _JsonNode_对象和 _objectMapper.convertValue()_方法
我们已经看到了将TypeReference或JavaType对象传递给objectMapper.readValue()方法的解决方案。
或者,我们可以在 Jackson 中使用树模型节点, 然后通过调用objectMapper.convertValue()方法将JsonNode对象转换为所需的类型。
同样,我们可以将TypeReference或JavaType的对象传递给objectMapper.convertValue()方法。
让我们看看每种方法的实际效果。
首先,让我们使用TypeReference 对象和objectMapper.convertValue()方法创建一个测试方法:
现在,让我们看看当我们将 _JavaType_对象传递给 _objectMapper.convertValue()_方法时会发生什么:
如果我们运行这两个测试,它们都会通过。因此,使用 _objectMapper.convertValue()_方法是解决问题的另一种方法。
6.创建通用反序列化方法
到目前为止,我们已经解决了在将 JSON 数组反序列化为 Java 集合时如何解决类转换问题。在现实世界中,我们可能希望创建一个通用方法来处理不同的元素类型。
现在对我们来说这不会是一项艰巨的工作。我们可以 在调用 _objectMapper.readValue()_方法时传递一个 _JavaType_对象:
接下来,让我们创建一个单元测试方法来验证它是否按预期工作:
如果我们运行它,测试将通过。
为什么不使用 _TypeReference_方法来构建泛型方法,因为它看起来更紧凑?
现在,让我们创建一个通用实用程序方法并将相应的 _TypeReference_对象传递给 _objectMapper.readValue()_方法:
该方法看起来很简单。如果我们再次运行测试方法,我们将得到:
糟糕,发生异常!
我们已经将一个 _TypeReference_对象传递给 _readValue()_方法,并且我们之前已经看到这种方法可以解决类转换问题。那么,为什么在这种情况下我们会看到相同的异常?
这是因为我们的方法是通用的。类型参数 T_不能在运行时具体化,即使我们传递一个带有类型参数 _T的 _TypeReference_实例。
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
Original: https://www.cnblogs.com/lingyejun/p/16379972.html
Author: 翎野君
Title: Jackson: java.util.LinkedHashMap cannot be cast to X
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537191/
转载文章受原作者版权保护。转载请注明原作者出处!