J'ai un Map<StructureNode, Map<String, String>>
imbriqué pour lequel j'ai besoin d'un sérialiseur de clés personnalisées & désérialiseur (StructureNode
contient des références à d'autres objets qui sont nécessaires pour fonctionner comme une clé pour cette carte). J'ai utilisé la méthode suivante pour cela:JSon - sérialisation de clés personnalisées de cartes imbriquées
Jackson Modules for Map Serialization
Donner le résultat suivant. Coutume sérialiseur:
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());
}
}
sur mesure désérialiseur:
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);
}
}
Utilisation:
@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;
Ce sérialise correctement une Map<StructureNode, String>
, mais appliqué à un Map<StructureNode, Map<String, String>>
imbriqué, il donne l'erreur suivante:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: java.lang.String cannot be cast to structure.StructureNode
Jackson semble utiliser la même méthode de sérialisation personnalisée pour la "sous-carte". Existe-t-il un bon moyen de résoudre ce problème, sans remplacer la "sous-carte" par un autre objet personnalisé (non Map
)?
Vous ne devriez pas utiliser un ObjectMapper privé dans votre sérialiseur et désérialiseur. – teppic
@teppic Pourquoi dites-vous cela? Je suivais l'exemple dans l'autre poste que j'ai mentionné, mais heureux de l'améliorer. Mais de toute façon, cela ne résout pas l'exception que je reçois. – tb189
Parce qu'il est distinct de celui que le code client utilise (et peut avoir instrumenté). – teppic