为什么两个看似相同的hashmaps在gson序列化时会有不同的行为?

dQw*_*XcQ 15 java hashmap gson

输入:

public static void main(String[] args) {

    final String key = "some key";
    final String value = "some value";

    Map<String, String> map1 = new HashMap<String, String>(){{put(key, value);}};
    System.out.println(new Gson().toJson(map1) + " " + map1.get(key));

    Map<String, String> map2 = new HashMap<>();
    map2.put(key, value);
    System.out.println(new Gson().toJson(map2) + " " + map2.get(key));
}
Run Code Online (Sandbox Code Playgroud)

输出:

null some value
{"some key":"some value"} some value

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

Gre*_*pff 21

因为map1,您已经创建了一个匿名子类.假设您main()调用了包含的类ExampleClass,则:

System.out.println(map1.getClass().getName())
Run Code Online (Sandbox Code Playgroud)

打印出来:

ExampleClass$1
Run Code Online (Sandbox Code Playgroud)

打印课程以map2获得收益:

java.util.HashMap
Run Code Online (Sandbox Code Playgroud)

至于Gson没有将其序列化的确切原因--Gson使用类名来查找转换器.如果您使用以下方法将其序列化:

System.out.println(new Gson().toJson(map1, HashMap.class));
Run Code Online (Sandbox Code Playgroud)

......它按预期工作.

  • [相关文档](https://google.github.io/gson/apidocs/com/google/gson/Gson.html#toJson-java.lang.Object-)。 (2认同)