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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python+opencv图像模板匹配—多模板匹配

    python+opencv图像模板匹配—多模板匹配

    2021年10月6日
    62
  • MySql必知必会内容导图

    MySql必知必会思维导图1.DBMS分类(1)关系数据库系统(2)面向对象的数据库系统(3)对象关系数据库系统对象关系数据库系统是在传统的关系数据模型基础上提供元祖,数据,集合等更为丰富

    2021年12月28日
    47
  • HttpClient详细解释

    HttpClient详细解释Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会

    2025年6月1日
    4
  • webstorm必备插件_vs code常用插件

    webstorm必备插件_vs code常用插件1).插件市场安装:在Settings/Preferences…->Plugins内手动添加第三方插件仓库地址:https://plugins.zhile.io2).安装你可以在Settings/Preferences…->Plugins里手动安装插件(InstallPluginFromDisk…)具体链接…

    2022年9月9日
    2
  • 硬盘数据恢复的方法_固态硬盘覆盖数据恢复吗

    硬盘数据恢复的方法_固态硬盘覆盖数据恢复吗想必许多朋友在硬盘数据遭到损坏时,第一反应就是拿到外面的电脑店去找专业的人士帮忙修复,这虽然也是一个可行的方法,但同时小编也觉得大可不必浪费这些时间专门跑到外面,且有可能要付出高昂的修复费用。那么,当硬盘损坏时,我们应如何第一时间恢复数据呢?答案就是用专业的数据恢复软件扫描恢复。所以在这里教大家如何用数据恢复软件来找回硬盘数据,不限制时间和地点,随时随地就能修复。操作也很简单,让我们来看看详细的步骤。1.在超级兔子官网下载软件后打开至主界面,在场景模式下选择U盘/内存卡恢复。2.点.

    2022年9月21日
    2
  • oracle 字段类型修改_数据库修改字段

    oracle 字段类型修改_数据库修改字段Oracle修改字段类型有一个表名为tb,字段段名为name,数据类型nchar(20)。1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:altertabletbmodify(namenvarchar2(20));2、假设字段有数据,则改为nvarchar2(20)可以直接执行:altertabletbmodify(namen

    2022年9月6日
    3

发表回复

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

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