Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么谷歌JSON库不能正确序列化这个HashMap?_Java_Json_Gson - Fatal编程技术网

Java 为什么谷歌JSON库不能正确序列化这个HashMap?

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

我有两个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>();
    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”);
}
};
其他数据
将不在输出中