因爲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.
可見,可以成功實現多層序列化。對象