JackJson反序列化为何一定需要TypeReference
来源:互联网 发布:网络高清图片大全 编辑:程序博客网 时间:2024/06/05 05:21
==
==
import java.util.ArrayList;import java.util.List;import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.ObjectMapper;public class TestJackson {public static ObjectMapper mapper = new ObjectMapper();public static ObjectMapper mapper1 = new ObjectMapper();public static void main(String[] args) throws Exception {List<Person> listPerson = new ArrayList<>();listPerson.add(new Person("张三1"));listPerson.add(new Person("张三2"));String jsonPerson = mapper.writeValueAsString(listPerson);// [{"name":"张三1"},{"name":"张三2"}]System.out.println(jsonPerson);// 现在我要用jsonPerson还原List<Person> getlistPerson = mapper1.readValue(jsonPerson,new TypeReference<List<Person>>() {});System.out.println(getlistPerson.get(0).name);}}class Person {public Person(){}public String name;public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
这是一个Jackson json的例子。
==
首先说泛型类。比如说我们平时使用的HashMap,类的定义是 public class HashMap<K,V> 这里的K V就是两个泛型,
如果要使用HashMap就需要指定泛型的实际类型。比如说 new HashMap<String,String>,
① 对于类的定义,也就是HashMap的制作角度讲,使用了K V字符后,便可以使用KV这两个字符,但是只能存在声明和引用的使用,而不能实例化。
② 对于类的使用来说,比如 HashMap<String,String> hashmap= new HashMap<String,String>,之后便可以使用所以定义的方法,此时put和get 所对应的KV必须一致。
如果是其他类,子类也是可以的。比如 List<Person> 之后,add方法可以存放Person的子类,get后也被Person所引用。不需转化。
如果是泛型方法的定义,
比如:
public <T> T add(T t){
return null;
}
这里的T已经和类无关了,这里的T对应的是 Person p=new ClassName().add(new Person()) 这里public后面<T>这里的T限定了后面的返回类型必须是T,参数也必须是T,尖括号里面的T来自于Person p 这里的Person p,也就是说因为 这里的Person导致了<T>的对应关系,于是乎 add方法的参数和返回值必须是Person。 当然add函数的返回和参数也可以不是T。
泛型擦除讲的是什么:
山面的①和②中①是定义 ②是声明,泛型擦除讲的是擦除② 而不是①。
比如说 List<Person> list=new ArrayList<>(); 这个语句经过编译后会成为 List list=new Arraylist(); 这样的语句。
但是 如果是class<T> Cname{ } 这个类经过编译之后,所有的信息都还在。
==
public class R {public static void main(String[] args) {TClass t = new TClass<String>() {};//TClass<java.lang.String>System.out.println(t.getClass().getGenericSuperclass());}}class TClass<T> {}
==
这里获取到了//TClass<java.lang.String>
这个代码其实是
public class R {public static void main(String[] args) {TClass t = new InnerTClass();System.out.println(t.getClass().getGenericSuperclass());}}class TClass<T> {}class InnerTClass extends TClass<String>{}
==
这里的两个代码等价了。根据superclass获取到了type的类型。Jackson就是以这个type为框架实现的类实例化。在InnerClass中泛型已经是被使用者而不是定义者了。
这里的String的意思是 java.lang.String
如果代码是
class TClass<T> {
}
class InnerTClass<String> extends TClass<String> {
}
这样的形式的话,那么对于这里的两个String 都是定义 ,不是使用,也就是说这里的两个String都和T是一个意思,而不是java.lang.Sting那个String。 两个没有一点关系。
- JackJson反序列化为何一定需要TypeReference
- Jackson 反序列化为List
- JSON反序列化为实体类
- JSON反序列化为Hibernate实体类
- 对象序列化反序列化为xml
- 将json字符串反序列化为DataTable
- XML文件反序列化为实体类
- XML字符串反序列化为对象
- unity xml反序列化为数据类
- 先反序列化为list,再遍历list,将每个元素反序列化为hashmap
- java 序列化为String无法反序列化
- 把 JSON 数据反序列化为 Arrays 和 Dictionaries
- WPF,对象序列化或反序列化为一字符串
- c# xml字符串 反序列化为实例对象
- 对象序列化成字符串与反序列化为对象
- JSON字符串反序列化为MAP对象开发实例
- 【Java】——Json反序列化为Java对象
- C#读取XML文件,反序列化为指定对象
- km算法(求二分图带权的最大匹配)
- Android的进程Hnadler与AsyncTask
- 最简单C语言的扫雷地图(不是游戏)
- spring MethodInterceptor 与 反射
- 深拷贝,浅拷贝
- JackJson反序列化为何一定需要TypeReference
- httpclient超时设置
- 详解温度传感器tmp275驱动
- Tachyon 0.7.1伪分布式集群安装与测试
- 关于算法的知识要点笔记
- HDU-3081 Marriage Match II
- Google反编译新工具——Enjarify
- eth0: ERROR while getting interface flags: No such device
- 网络编程