Java中讓fastJson識別Colloction和Map中的泛型類
阿新 • • 發佈:2019-05-14
return input 泛型 簡單 得到 針對 this 一個 urn
由於fastJson的高效性,最近采用fastJson來做序列化並存儲數據,但出現了一個麻煩的問題,如果將Map<K,V>這樣的類型序列化,反序列化就會不盡人意,有以下嘗試:
- 使用JSON.parseObject(json):得到的結果是無類型Map,其value為JSONObject。
- 使用JSON.parseObject(json, Map.class):結果同上。
雖然說使用JSONObject.toJavaObject(V.class)也能夠完成所求,但是這樣的方法還是略麻煩,而且如果對key也要利用,那就要對key和value都來一下。在查閱資料後終於找到了正確的方案:TypeReference類。
簡單介紹下,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) { }); }
測試如下:
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(); }); } }
測試結果如下:
0
My name is Cielo and I am 3.
1
My name is Vicky and I am 1.
可見,能夠成功實現多層序列化。
Java中讓fastJson識別Colloction和Map中的泛型類