Java中讓fastJson識別Colloction和Map中的泛型類

因爲fastJson的高效性,最近採用fastJson來作序列化並存儲數據,但出現了一個麻煩的問題,若是將Map<K,V>這樣的類型序列化,反序列化就會不盡人意,有如下嘗試:java

  • 使用JSON.parseObject(json):獲得的結果是無類型Map,其value爲JSONObject。
  • 使用JSON.parseObject(json, Map.class):結果同上。

雖說使用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.

可見,可以成功實現多層序列化。對象

相關文章
相關標籤/搜索