Java Gson忽略映射中键的自定义序列化程序

Java Gson忽略映射中键的自定义序列化程序,java,json,serialization,map,gson,Java,Json,Serialization,Map,Gson,我正在尝试使用GSON将映射序列化/反序列化为JSON 我有一张地图是由 HashMap<Test, List<Something>> map = new HashMap<>(); 还有一些像这样的测试代码 class Test { public Test(){} public Test(String str){test = str;} String test; } class Something { public Something(){}

我正在尝试使用GSON将映射序列化/反序列化为JSON

我有一张地图是由

HashMap<Test, List<Something>> map = 
  new HashMap<>();
还有一些像这样的测试代码

class Test {
 public Test(){}
 public Test(String str){test = str;}
 String test;
}

class Something {
 public Something(){}
 public Something(String str){something = str;}
 String something;
}
List<Something> somelist = new ArrayList<Something>();

somelist.add(new Something("something1"));
somelist.add(new Something("something2"));

map.put(new Test("test1"), somelist);
Gson gson = new GsonBuilder().setPrettyPrinting()
    .registerTypeAdapter(Test.class, new JsonSerializer<Test>() {
      public JsonElement serialize(Test arg0, Type arg1,
          JsonSerializationContext arg2) {
        return new JsonPrimitive(arg0.test);
      }
    }).registerTypeAdapter(Something.class, new JsonSerializer<Something>() {

      @Override
      public JsonElement serialize(Something arg0, Type arg1,
          JsonSerializationContext arg2) {
        return new JsonPrimitive(arg0.something);
      }
    }).create();
然而,这在某种程度上是意料之中的,然后我尝试为类创建一个自定义序列化程序,如下所示

class Test {
 public Test(){}
 public Test(String str){test = str;}
 String test;
}

class Something {
 public Something(){}
 public Something(String str){something = str;}
 String something;
}
List<Something> somelist = new ArrayList<Something>();

somelist.add(new Something("something1"));
somelist.add(new Something("something2"));

map.put(new Test("test1"), somelist);
Gson gson = new GsonBuilder().setPrettyPrinting()
    .registerTypeAdapter(Test.class, new JsonSerializer<Test>() {
      public JsonElement serialize(Test arg0, Type arg1,
          JsonSerializationContext arg2) {
        return new JsonPrimitive(arg0.test);
      }
    }).registerTypeAdapter(Something.class, new JsonSerializer<Something>() {

      @Override
      public JsonElement serialize(Something arg0, Type arg1,
          JsonSerializationContext arg2) {
        return new JsonPrimitive(arg0.something);
      }
    }).create();

如何使Gson正确地序列化我的密钥?

Gson的映射支持通过使用
String.valueOf(key)
(这只是
(obj==null)?“null”:obj.toString()
)序列化密钥和反序列化它们的标准TypeAdapter来工作。值始终由TypeAdapters处理


记住这一点,为了让您的映射按照您所描述的进行序列化和反序列化,您需要在测试中重写toString方法,并提供一个JsonDeserializer来反序列化它。

我发现的最简单的方法似乎是设置enableComplexMapKeySerialization()初始构建Gson对象时的选项

这迫使Gson使用标准规则序列化键,而不仅仅是对其调用toString()。然后,您可以根据需要添加自己的序列化器/反序列化器,或者让Gson处理它


更多信息

如果我能多次投票,我会——花3个多小时试图弄清楚为什么Gson在地图对象上使用“toString”。。。回答得好!工作得很好!