首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gson忽略Map中键的自定义序列化程序

Gson忽略Map中键的自定义序列化程序
EN

Stack Overflow用户
提问于 2014-07-29 05:10:15
回答 2查看 928关注 0票数 4

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

我有一个地图,它是由

代码语言:javascript
复制
HashMap<Test, List<Something>> map = 
  new HashMap<>();

它包含两个简单的类,它们的定义如下

代码语言:javascript
复制
class Test {
 public Test(){}
 public Test(String str){test = str;}
 String test;
}

class Something {
 public Something(){}
 public Something(String str){something = str;}
 String something;
}

和一些测试代码,如下所示

代码语言:javascript
复制
List<Something> somelist = new ArrayList<Something>();

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

map.put(new Test("test1"), somelist);

默认情况下,Gson似乎无法对其进行序列化,并生成以下结果

代码语言:javascript
复制
{
  "test.TestJsonClass$Test@15db9742": [
    {
      "string": "something1"
    },
    {
     "string": "something2"
    }
  ]
}

然而,这在某种程度上是意料之中的,然后我尝试为这个类创建一个自定义序列化程序,如下所示

代码语言:javascript
复制
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似乎忽略了我的键序列化程序(Test),并产生了以下结果

代码语言:javascript
复制
{
  "test.TestJsonClass$Test@15db9742": [
    "something1",
    "something2"
 ]
}

怎样才能让Gson正确地序列化我的键?

EN

回答 2

Stack Overflow用户

发布于 2014-12-15 22:21:24

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

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

更多信息here

票数 5
EN

Stack Overflow用户

发布于 2014-07-29 06:35:29

Gson的Map支持的工作方式是使用String.valueOf(key)(也就是(obj == null) ? "null" : obj.toString())来序列化您的键,并使用标准TypeAdapters来反序列化它们。值始终由TypeAdapters处理。

考虑到这一点,为了让您的映射根据您所描述的内容进行序列化和反序列化,您需要覆盖测试中的toString方法,并提供一个用于反序列化它的JsonDeserializer。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25004418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档