使用HashMap〈String,Object>时的Gson toJson()方法问题

tvz2xvvm  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(300)

我已经用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}
uinbv5nw

uinbv5nw1#

从你声明的方式来看,map不是一个HashMap,而是一个匿名类。Gson不是设计来处理匿名类和内部类的。
你可以检查这个issue,它询问匿名类的序列化,但是它是关闭的,所以可能没有计划添加对它的支持。正如你在讨论中看到的,可能的解决方案是提供类型。

System.out.println(new Gson().toJson(map, new TypeToken<HashMap<String, Object>>(){}.getType()));

又是一个related discussion

vptzau2j

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类型。
示例:

Map<String,Object> map = new HashMap<String, Object>(){{
  this.put("test",1);
}};
Map<String,Object> map2 = new HashMap<>();
map2.put("test",1);

final Type type = new TypeToken<HashMap<String, Object>>() {
}.getType();

System.out.println(new Gson().toJson(map, type));
System.out.println(new Gson().toJson(map2));

参考https://www.javadoc.io/doc/com.google.code.gson/gson/latest/com.google.gson/com/google/gson/Gson.html

相关问题