Java Gson忽略映射中键的自定义序列化程序
我正在尝试使用GSON将映射序列化/反序列化为JSON 我有一张地图是由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(){}
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”。。。回答得好!工作得很好!