1
我有一个嵌套Map<StructureNode, Map<String, String>>
我需要一个自定义键序列化器&解串器(StructureNode
包含对其他对象的引用,这些对象需要作为此映射的键)。我用这个下面的方法:JSon - 嵌套地图的自定义键序列化
Jackson Modules for Map Serialization
给出以下结果。自定义序列:
public class StructureNodeKeySerializer extends JsonSerializer<StructureNode> {
private static final ObjectMapper mapper = new ObjectMapper();
@Override
public void serialize(StructureNode value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
StringWriter writer = new StringWriter();
mapper.writeValue(writer, value.copyUpwards());
gen.writeFieldName(writer.toString());
}
}
自定义解串器:
public class StructureNodeKeyDeserializer extends KeyDeserializer {
private static final ObjectMapper mapper = new ObjectMapper();
@Override
public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException {
return mapper.readValue(key, StructureNode.class);
}
}
用法:
@JsonDeserialize(keyUsing = StructureNodeKeyDeserializer.class) @JsonSerialize(keyUsing = StructureNodeKeySerializer.class)
private Map<StructureNode, String> structureIds;
@JsonDeserialize(keyUsing = StructureNodeKeyDeserializer.class) @JsonSerialize(keyUsing = StructureNodeKeySerializer.class)
private Map<StructureNode, Map<String, String>> metadata;
这正确串行化一个Map<StructureNode, String>
,但应用到嵌套Map<StructureNode, Map<String, String>>
,它提供了以下错误:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: java.lang.String cannot be cast to structure.StructureNode
Jackson似乎对“子地图”使用相同的自定义序列化方法。有没有一种很好的方法来解决这个问题,而不用另一个定制(非Map
)对象替换“子地图”?
你不应该在你的序列化器和反序列化器中使用私有的'ObjectMapper'。 – teppic
@teppic你为什么这么说?我在我提到的另一篇文章中关注了这个例子,但很高兴能够改进它。但无论如何,这并不能解决我得到的例外。 – tb189
因为它与客户端代码正在使用的(并且可能已被检测到)是分开的。 – teppic