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


相关推荐

  • 双倍余额递减法计提折旧的计算公式_双倍余额递减法折旧的公式

    双倍余额递减法计提折旧的计算公式_双倍余额递减法折旧的公式双倍余额递减法:年折旧率=2/预计的折旧年限×100%月折旧率=年折旧率/12月折旧额=固定资产账面净值×月折旧率年数总和法:年折旧率=尚可使用年数/预计使用年限的年数总和月折旧率

    2022年8月3日
    6
  • java编写股票交易软件有哪些,java开发程序源代码_炒股软件说明-小S股票

    java编写股票交易软件有哪些,java开发程序源代码_炒股软件说明-小S股票证券双极星极手机炒股系统java版40p1。2。1。2。定义,省略语及专业用语定义,省略语及专业用语?Sun制定的支持小设备的Java运行环境标准;分为多种配置环境;?本来是针对家电应用来开发的,但却在当时日渐普及的互连网上流行了起来。这是因为,就可以很容易的在网页中嵌入动画和游戏。这样,现在JAVA程序逐渐被应用于手机、家电、PC、服务器等不同的领域之中?NokiaSeries40-NokiaS…

    2022年6月17日
    25
  • js ajax 跨域问题 解决方案[通俗易懂]

    js ajax 跨域问题 解决方案[通俗易懂]什么是跨域问题?跨域问题来源于JavaScript的”同源策略”,即只有协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题。查看浏览器开发者工具Console报错:Failedtoloadhttp://a.a.com:8080/A/FromServlet?userName=123:No’Access-Control-Allow-Origi.

    2022年8月24日
    8
  • 通过Kivy将Python文件打包成apk

    通过Kivy将Python文件打包成apk一.前言Kivy是一个开源的Python框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等。且Kivy可以运行于Windows,Linux,MacOS,Android,iOS等当前绝大部分主流桌面/移动端操作系统。周日在配置Kivy时,教程繁多繁琐,让自己有些找不着北,挨个试后,经常在某处卡壳,屡屡碰壁,希望自己接下来的

    2022年5月20日
    47
  • vue axios跨域请求_vue跨域访问

    vue axios跨域请求_vue跨域访问vue中axios跨域请求1.axios是第三方库使用方法:使用npm:$npminstallaxios使用bower:$bowerinstallaxios使用cdn:<scriptsrc=”https://unpkg.com/axios/dist/axios.min.js”></script>axios…

    2025年11月1日
    2
  • NOIP 2011 计算系数

    NOIP 2011 计算系数数论

    2022年9月2日
    7

发表回复

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

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