1. 程式人生 > >Gson序列化匿名內部類失敗

Gson序列化匿名內部類失敗

坑1:我們初始化Map之類的集合的時候會用如下優雅的方式:

Map<String, String> map = new HashMap<String, String>() {{
            put("cjy", "cjy");
        }};
Gson gson = new Gson();
        System.out.println(gson.toJson(map));

但是會發現序列化後為null;這是因為上述方式產生的map是匿名內部類的例項,也就是說new出來的map沒有類名,這樣的話Gson只知道該類的父類是HashMap而不知道該類。又由於Gson是通過類反射得到屬性再序列化,因為不知道類名,所以轉json失敗。

解決辦法,Map<String,String> map2=new HashMap<String,String>(map);後再轉json

坑2:

Map<String, String> map = new HashMap<String, String>() {{
            put("cjy", "cjy");
        }};
        Set<Map.Entry<String, String>> set2 = map.entrySet();
        Gson gson = new Gson();
        System.out.println(gson.toJson(set2))

結果為{[]}, 如上也是無法轉換json的,這是因為使用map.entrySet()方法得到的set集合是一個內部類,裡面並沒有真正的元素陣列,而是使用外部類HashMap的元素陣列,這時雖然該內部類有類名(HashMap.EntrySet),但是類裡面沒有元素陣列,以Gson通過類來找屬性的時候會發現沒有屬性而轉換失敗

為什麼坑1是null呢:是因為Gson連類都沒找到

為什麼坑2是{[]}:找到了類,但是沒有元素