我已经用Gson把Map〈String,Object〉序列化到json了,但是我遇到了一些问题,你能告诉我为什么会这样吗?
编码:
HashMap<String,Object> map = new HashMap<String, Object>(){{
this.put("test",1);
}};
HashMap<String,Object> map2 = new HashMap<>();
map2.put("test",1);
System.out.println(new Gson().toJson(map));
System.out.println(new Gson().toJson(map2));
输出量:
null
{"test":1}
2条答案
按热度按时间uinbv5nw1#
从你声明的方式来看,
map
不是一个HashMap,而是一个匿名类。Gson不是设计来处理匿名类和内部类的。你可以检查这个issue,它询问匿名类的序列化,但是它是关闭的,所以可能没有计划添加对它的支持。正如你在讨论中看到的,可能的解决方案是提供类型。
又是一个related discussion。
vptzau2j2#
如果您调试代码,您将看到
map.getClass()
不会像您预期的那样返回“HashMap”,而是返回一个匿名类(如果您在名为 Main 的类中运行代码,则map.getClass()
将类似于 Main$1)。map2.getClass()
将按预期返回 HashMap。如果选中 *Gson方法到Json * Javadocs:
此方法将指定的对象序列化为其等效的Json表示形式。当指定的对象不是泛型类型时,应使用此方法。此方法使用Object.getClass()获取指定对象的类型,但getClass()会丢失泛型类型信息。请注意,如果任何对象字段都是泛型类型,对象本身不应该是泛型类型。如果对象是泛型类型,请改用toJson(Object,Type)。如果要将对象写出到Writer,请改用toJson(Object,Appendable)。
要解决您的“问题”,您必须指定
map
类型。示例:
参考:https://www.javadoc.io/doc/com.google.code.gson/gson/latest/com.google.gson/com/google/gson/Gson.html