1. 程式人生 > >Java中讓fastJson識別Colloction和Map中的泛型類

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

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中的泛型類