包头网站建设,旅游景点网页设计作品,如何对网站用户分析,wordpress多重筛选机制Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化#xff0c;及TyperReference的实现原理。对于获取泛型类型信息的场景#xff0c;TypeReference是一个可以参考的通用解决方案。
Jackson ObjectMapper的readVa…Jackson是一个比较流行的Json序列化和反序列化框架。本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化及TyperReference的实现原理。对于获取泛型类型信息的场景TypeReference是一个可以参考的通用解决方案。
Jackson ObjectMapper的readValue可以将Json字符串反序列化为Java对象。
例如将下列Json串反序列化为ListUserResource类型。
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;
}1理想的实现方式
理想的实现方式是告诉ObjectMapper的readValue方法我要的是ListUserResource帮我反序列化成这个类型。
ListUserResource list new ObjectMapper().readValue(userResourcesStr, ListUserResource.class);现实的编译器告诉你这不行Cannot select from parameterized type. 也很好理解Java编译器认为List是Class而List则不是。
2换一种实现方式
既然不能用ListResource.class那如果我告诉ObjectMapper的readValue方法我要的是LIst类型但返回值类型是ListUserResource会发生什么呢
ListUserResource list new ObjectMapper().readValue(userResourcesStr, List.class);这时候倒没有编译错误但是会有警告Unchecked assignment: java.util.List to java.util.ListUserResource显然ObjectMapper并不能反序列化为UserResource类型而是LinkedHashMap类型。如下图所示 3TypeReference的实现方式
ObjectMapper提供了readValue(String content, TypeReference valueTypeRef)接口第二个参数为new一个TypeReference的子类实例new TypeReferenceListUserResource(){}。泛型抽象类TypeReference用于通过子类获取完整的泛型类型信息。 ListUserResource list new ObjectMapper().readValue(userResourcesStr, new TypeReferenceListUserResource(){});4TypeReference实现原理
上例中new TypeReferenceListUserResource(){}子类的实例TypeReference源码部分比较简单主要逻辑是通过getClass().getGenericSuperclass();获取父类中的参数化类型ParameterizedType。
这部分不清楚可以看Java 中的Type类型及其实现【学习记录】
TypeReference主要源码
protected TypeReference()
{Type superClass getClass().getGenericSuperclass();_type ((ParameterizedType) superClass).getActualTypeArguments()[0];
}getGenericSuperclass返回一个Type类型的对象代表实体classinterfaceprimitive type or void的直接父类如果父类是参数化类型则返回的Type对象可准确反应源码中使用的实际type参数。
Class的genericInfo 5总结
Jackson ObjectMapper 提供了TypeReference支持对泛型对象的反序列化对于获取泛型类型信息的场景TypeReference是一个可以参考的通用解决方案。