当前位置: 首页 > 知识库问答 >
问题:

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

严俊彦
2023-03-14
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);
{
  "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();
{
  "test.TestJsonClass$Test@15db9742": [
    "something1",
    "something2"
 ]
}

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

共有1个答案

羊舌自强
2023-03-14

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

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

更多信息请参见

 类似资料:
  • 问题内容: 遵循在使用GSON解析JSON时使用枚举中的建议,我正在尝试序列化其键是使用Gson 的映射。 考虑以下类别: 两个问题: 为什么打印而不是? 我该如何打印? 问题答案: Gson对密钥使用了专用的序列化器。默认情况下,它使用将要用作键的对象的。对于类型,基本上就是常量的名称。,默认为类型,仅当将序列化为JSON值(对名称除外)时才使用。 使用来构建你的实例。

  • 我想将包含另一个空值POJO的POJO序列化为JSON。 例如,给定: 连载之后,它看起来会是这样的 如果类的所有字段也为空,是否可以排除空对象?理想情况下,全局适用于每个对象,而无需编写自定义代码。

  • 如果类的所有字段也为空,是否可以排除空对象?理想情况下,全局地用于每个对象,而无需编写自定义代码。

  • 我有一个不能用Gson正确序列化的类(类只是name和HashMap),所以我编写了一个自定义序列化程序来从HashMap中打印名称和键值对。 此外,这是实际打印的内容,序列化整个对象并不像我所期望的那样工作,也不只是直接打印对象。 任何帮助都将不胜感激。

  • 问题内容: 我有这个架构: 我想用Gson序列化Data对象,并得到类似的东西: 为此,我必须对学生部分使用自定义序列化程序,以便Gson仅打印学校的ID。但是对于学校来说,我必须有正常的序列化器。 我如何只用一个Gson对象就能完成所有工作? 问题答案: 您可以编写自定义序列化器,如下所示:

  • 我将 Jackson 2.7.5 与 Jersey 2.25.1 配合使用。我正在尝试修复现有的生产代码,当它在JSON输入中获得意外字段时,它现在因“无法识别的PropertyException:无法识别的字段”而失败。 在研究这个问题时,我发现了几篇旧帖子(5年),建议各种修复方法与我当前的代码非常不同。我不太关注这些,因为它们是针对旧版本的Jackson/Jersey。最近的建议,包括泽西岛