当JSON解析遇上了泛型
、原理分析 1. 先理解泛型与编译器虚拟机的关系以及什么是擦除? 解析: Java语言的泛型基本上是在编译器中实现的。由编译器执行类型检测和推断后生成普通的非泛型的字节,虚拟机是完全无感知泛型存在的,这种实现技术称为擦除。编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除。 为什么使用Jackson的readValue方法解析JSON字符串后result的属性值会是LinkedHashMap而不是我们指定的LeaderboardResp呢? 解析:泛型只在编译期间起到检测作用,当编译器将泛型类编译完成之后,泛型类的类型参数都被全部擦除。接下来在运行期间虚拟机并不知道泛型的存在,当对JSON字符串进行解析时由于泛型被擦除了导致虚拟机并不知道要将其解析成哪种类型,所以就解析为了默认的LinkedHashMap类型,导致出现了上面的场景。 3. 那Gson是如何解决泛型擦除这种情况呢? 我们来看看这一句核心代码 析:Gson的做法非常巧妙,如上面的代码所示,将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,然后通过getType()方法就可以获取到我们想要的泛型类的泛型参数类型。可以理解为是将泛型类型存起来,解决了泛型擦除的问题。 五、最后
感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。如果您对于此场景有更好的解决方案也欢迎提出讨论。 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |