因为fastJson的高效性,最近采用fastJson来作序列化并存储数据,但出现了一个麻烦的问题,若是将Map<K,V>这样的类型序列化,反序列化就会不尽人意,有如下尝试:java
虽说使用JSONObject.toJavaObject(V.class)也可以完成所求,可是这样的方法仍是略麻烦,并且若是对key也要利用,那就要对key和value都来一下。在查阅资料后终于找到了正确的方案:TypeReference类。json
简单介绍下,TypeReference类是Java给出的用于明确指定反序列化类型的类,其<>中放入一个复合类型,其参数为复合类型的Class对象,使用示例(我对该方法针对Map作的一个封装)以下:测试
public static <K, V> Map<K, V> json2Map(String path, Class<K> k, Class<V> v) throws Exception { return JSON.parseObject(path, new TypeReference<Map<K, V>>(k, v) { }); }
测试以下:this
public class TypeReferenceTest { public static <K, V> Map<K, V> json2Map(String path, Class<K> k, Class<V> v) throws Exception { return JSON.parseObject(path, new TypeReference<Map<K, V>>(k, v) { }); } public static class Person { private String name; private String age; public Person(String name, String age) { this.name = name; this.age = age; } public void introduce() { System.out.println("My name is " + name + " and I am " + age + "."); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } } public static void main(String[] args) throws Exception { Map input = new HashMap(); input.put(0L, new Person("Cielo", "3")); input.put(1L, new Person("Vicky", "1")); String str = JSON.toJSONString(input); Map<Long, Person> map = json2Map(str, Long.class, Person.class); map.forEach((key, value) -> { System.out.println(key); value.introduce(); }); } }
测试结果以下:code
0 My name is Cielo and I am 3. 1 My name is Vicky and I am 1.
可见,可以成功实现多层序列化。对象