Java 为什么谷歌JSON库不能正确序列化这个HashMap?
我有两个HashMap要使用Google Gson库序列化为JSON:Java 为什么谷歌JSON库不能正确序列化这个HashMap?,java,json,gson,Java,Json,Gson,我有两个HashMap要使用Google Gson库序列化为JSON: final Map<String, String> map1 = new HashMap<String, String>() { { put("abc", "def"); } }; final Map<String, String> map2 = new HashMap<String, String&g
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"}
final Map map1=new HashMap(){
{
put(“abc”、“def”);
}
};
final Map map2=新HashMap();
map2.put(“abc”、“def”);
最终Gson Gson=新Gson();
最后一个字符串s1=gson.toJson(map1);//“空”
最后一个字符串s2=gson.toJson(map2);//{“abc”:“def”}
为什么第二个HashMap被正确序列化,而第一个HashMap没有被正确序列化?Gson使用反射,并不关心类是否实现了
可序列化
。但是,Gson不需要无参数构造函数(请参阅):
Gson需要先创建一个伪类实例,然后才能进行反序列化
将Json数据导入其字段。。。我们通过调用
无参数构造函数
当您调用toJson(objectobj)
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"}
final Map map1=new HashMap(){
{
put(“abc”、“def”);
}
};
Gson Gson=新的Gson();
字符串json=gson.toJson(map1,newtypetoken(){}.getType());//{“abc”:“def”}
编辑:请注意,这仅适用于匿名类,因为您的匿名类可以强制转换为Map
。如果您有更复杂的内部类,例如:
final Map<String, String> map1 = new HashMap<String, String>() {
private String additionalData = "Foo";
{
put("abc", "def");
}
};
final Map map1=new HashMap(){
私有字符串additionalData=“Foo”;
{
put(“abc”、“def”);
}
};
其他数据
将不在输出中