我有两个HashMaps使用Google Gson库序列化为JSON:
final Map<String, String> map1 = new HashMap<String, String>() {
{
put("abc", "def");
}
};
final Map<String, String> map2 = new HashMap<String, String>();
map2.put("abc", "def");
final Gson gson = new Gson();
final String s1 = gson.toJson(map1); // "null"
final String s2 = gson.toJson(map2); // {"abc":"def"}
Run Code Online (Sandbox Code Playgroud)
为什么第二个HashMap正确序列化但不是第一个HashMap?
Gson使用反射,并不关心类是否实现Serializable.但是,Gson需要一个无参数构造函数(参见设计文档):
Gson需要创建一个虚拟类实例才能将Json数据反序列化为其字段...我们通过调用无参数构造函数创建类实例...
当你打电话给toJson(Object obj)Gson时,他会obj.getClass()用来弄清楚如何构建一个"虚拟实例" obj,在你的情况下是一个匿名的内部类.内部类需要引用它们的包含类才能构造.序列化时无法引用外部类,这就是结果的原因null.您可以通过向Gson提供有关如何构造对象的更多信息来解决此问题:
final Map<String, String> map1 = new HashMap<String, String>() {
{
put("abc", "def");
}
};
Gson gson = new Gson();
String json = gson.toJson(map1, new TypeToken<Map<String, String>>() {}.getType()); // {"abc":"def"}
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,这只适用于您的匿名类可以强制转换为Map<String, String>.如果你有一个更复杂的内部类,例如:
final Map<String, String> map1 = new HashMap<String, String>() {
private String additionalData = "Foo";
{
put("abc", "def");
}
};
Run Code Online (Sandbox Code Playgroud)
additionalData 不会在输出中.