java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」

java typereference_Java泛型 | Jackson TypeReference获取泛型类型信息「建议收藏」前言Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。实例JacksonObjectMapper的readValue可以将Json字符串反序列化为Java对象。如下例中将[{“id”:n…

大家好,又见面了,我是你们的朋友全栈君。

前言

Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理。对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。

实例

Jackson ObjectMapper的readValue可以将Json字符串反序列化为Java对象。如下例中将[{“id”:null,”name”:” “,”age”:500,”gender”:false,”email”:”email”,”employed”:true,”salary”:10}]反序列化为List类型。

Json字符串:

[{

“id”: null,

“name”: ” “,

“age”: 500,

“gender”: false,

“email”: “email”,

“employed”: true,

“salary”: 10

}]

UserResource实体类:

@Builder

@Data

@NoArgsConstructor

@AllArgsConstructor

public class UserResource {

private UUID id;

private String name;

private int age;

private boolean gender;

private String email;

private boolean employed;

private BigDecimal salary;

}

实现

理想的实现方式

理想的实现方式是告诉ObjectMapper的readValue方法,我要的是List,帮我反序列化成这个类型。

List list = new ObjectMapper().readValue(userResourcesStr, List.class);

现实是编译器告诉你这不行,Cannot select from parameterized type. 也很好理解,Java编译器认为List是Class,而List则不是。

换一种方式实现

既然不能用List.class, 那如果我告诉ObjectMapper的readValue方法,我要的是List类型,但返回值类型是List, 会发生什么呢?

List list = new ObjectMapper().readValue(userResourcesStr, List.class);

这时候倒没有编译错误, 但是会有警告:Unchecked assignment: ‘java.util.List’ to ‘java.util.List’, 显然ObjectMapper并不能反序列化为UserResource类型,而是LinkedHashMap类型。如下图所示:

TypeReference的实现方式

ObjectMapper提供了readValue(String content, TypeReference valueTypeRef)接口,第二个参数为new一个TypeReference的子类实例:new TypeReference>(){}。泛型抽象类TypeReference用于通过子类获取完整的泛型类型信息。

public T readValue(String content, TypeReference valueTypeRef)

List list = new ObjectMapper().readValue(userResourcesStr, new TypeReference>(){});

TypeReference 实现原理

上例中new TypeReference>(){}子类的实例,TypeReference源码部分比较简单,主要逻辑是,通过getClass().getGenericSuperclass()获取父类中的参数化类型(ParameterizedType):

TypeReference主要源码:

protected TypeReference()

{

Type superClass = getClass().getGenericSuperclass();

_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

}

getGenericSuperclass返回一个Type类型的对象,代表实体(class, interface, primitive type or void)的直接父类,如果父类是参数化类型,则返回的Type对象可准确反映源代码中使用的实际type参数。

Class的genericInfo:

总结Jackson ObjectMapper 提供了TypeReference支持对泛型对象的反序列化;

对于获取泛型类型信息的场景,TypeReference是一个可以参考的通用解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149950.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 不同数据库的特点_简述数据库的特点

    不同数据库的特点_简述数据库的特点MySQL1.事务四大特性原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;

    2022年8月1日
    6
  • 基于麦克风阵列的现有声源定位技术有_麦克风阵列

    基于麦克风阵列的现有声源定位技术有_麦克风阵列麦克风阵列:麦克风阵列是由一定数目的声学传感器(麦克风)按照一定规则排列的多麦克风系统,而基于麦克风阵列的声源定位是指用麦克风拾取声音信号,通过对麦克风阵列的各路输出信号进行分析和处理,得到一个或者多个声源的位置信息。麦克风阵列系统的声源定位技术研究意义在于:输入的信息只有两个方向难以确定声源的位置,人类的听觉系统主要取决于头和外耳气压差声波实现声源定位。假使没有这个压力差,只能定位在平面上声源的位置,但就无法知道声音是从前面,或从后面传来的。因此,由人的听觉系统,科技研发人员得到了灵感,使用多个麦克风

    2025年12月6日
    5
  • matplotlib的安装教程以及简单调用

    matplotlib的安装教程以及简单调用1.matplotlib的下载我们的常规下载方式就是在命令行中输入:`pipinstallmatplotlib`,这样你就可以从官方进行下载,但是这样的下载速度是十分的慢的,我们在最详细的AnacondaInstallers的安装【numpy,jupyter】(图+文)(https://chen-ac.blog.csdn.net/article/details/122374025?spm=1001.2014.3001.5502)这一博客中曾写到,可以在`pipinstallmatplo

    2022年6月15日
    68
  • 02将代码开源到github(不会使用github的来看看吧)「建议收藏」

    02将代码开源到github(不会使用github的来看看吧)

    2022年1月22日
    248
  • 系统发育树原理_环形系统发育树怎么理解

    系统发育树原理_环形系统发育树怎么理解文章转载于 Original 2017-07-08 Berlin生信百科达尔文在19世纪中叶创立了科学的生物进化学说——达尔文进化论。以自然选择为主要核心,他第一次对

    2022年8月2日
    6
  • MFC进度条编程「建议收藏」

    MFC进度条编程「建议收藏」1.进度条的主要功能进度条控制(ProgressControl)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗口标题条的颜色来不断填充。进度条控制在MFC类库中的封装类为CProgressCtrl,通常仅作为输出类控制,所以其操作主要是设置进度条的范围和当前位置,并不断地更新当前位置。进度条的范

    2022年7月12日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号