Gson序列化匿名內部類失敗
阿新 • • 發佈:2018-12-26
坑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是{[]}:找到了類,但是沒有元素