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