Gson toJson() 方法问题与 HashMap<String,Object>



我已经使用Gson来序列化Map<String,Object>但是我遇到了一些问题,你能告诉我为什么会发生这种情况吗?

代码:

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}

您声明它的方式,map不是HashMap,而是一个匿名类。Gson不是为处理匿名类和内部类而设计的。

你可以检查这个问题,它询问匿名类的序列化,但它已经关闭,所以可能没有计划增加对这个的支持。正如您在讨论中看到的,可能的解决方法是提供类型。

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

另一个相关的讨论。

如果调试代码,您将看到map.getClass()不会返回一个HashMap"如您所料,而是一个匿名类(如果您在名为Main的类中运行代码,则map.getClass()将类似于Main$1)。

map2.getClass()将返回HashMap

如果你检查Gson method toJsonJavadocs:

此方法将指定对象序列化为其等效的Json表示。此方法应在指定对象时使用不是泛型类型。此方法使用Object.getClass()获取类型,但是getClass()失去泛型类型信息,因为Java的类型擦除特性。请注意如果任何对象字段都是泛型类型,只是对象本身不应该是泛型类型。如果对象是泛型类型,则使用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

相关内容

最新更新