【发布时间】:2017-10-19 18:14:57
【问题描述】:
我有一个嵌套的Map<StructureNode, Map<String, String>>,我需要一个自定义键序列化器和解串器(StructureNode 包含对其他对象的引用,这些对象需要用作此映射的键)。为此,我使用了以下方法:
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 你为什么这么说?我正在按照我提到的另一篇文章中的示例进行操作,但很高兴对其进行改进。但无论哪种方式,这都不能解决我遇到的异常。
-
因为它与客户端代码正在使用(并且可能已检测)的代码是分开的。
标签: java json serialization jackson