java - Gson 忽略映射中键的自定义序列化器

标签 java json serialization dictionary gson

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

我有一个由

定义的 map
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 似乎无法默认序列化它并产生以下结果

{
  "test.TestJsonClass$Test@15db9742": [
    {
      "string": "something1"
    },
    {
     "string": "something2"
    }
  ]
}

这在某种程度上是预料之中的,但是,我然后尝试为这样的类创建一个自定义序列化器

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 似乎忽略了我的 key (测试)序列化器并产生以下结果

{
  "test.TestJsonClass$Test@15db9742": [
    "something1",
    "something2"
 ]
}

如何让 Gson 正确序列化我的 key ?

最佳答案

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

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

更多信息here

关于java - Gson 忽略映射中键的自定义序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004418/

相关文章:

php - 该数据是否被另一个组件覆盖?

java - Dagger 2 - 提供具有自己依赖性的方法

java - 将所有 Select web 元素返回为 Selenium 中的列表

c# - 反序列化时字段为空时如何将默认值设置为Guid

javascript - 将属性从嵌套模型映射到 extjs 表单 View

java - 实现 Serialized 的类无法读取Object

java - Spring boot 1.4.x 和自定义 CharsetProvider

java - 如何使用 Java 流在第一个和最后一个嵌套对象之间创建映射<k,v>?

xml - 使用 Jackson 将 xml 转换为 json

java - 反序列化得到 null 字符串应该有值