I have inherited a project. So far it uses something binary for serialization.
I would like to flip the serialization to JSON / Jackson.
The model has a "beautiful" construct stored into the database:
A Map
whose key is another entity (ExternalId
) with several properties.
ExternalId
itself is also stored to a database.
To make it a bit funnier, ExternalId
is a superclass with 4 subclasses, which I map using @JsonTypeInfo
and @JsonTypeName
. That works.
Now, there is that Map<ExternalId, BigDecimal>
(sic). And Jackson tells me:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot find a (Map) Key deserializer for type [simple type, class com.iptiq.payment.id.ExternalId]
at [Source: (byte[])"{
"externalIdsWithAmount" : {
"...toString() of ExternalId..." : 20.00000000
},
In "...toString()"
there is the result of ExternalId#toString()
.
So, I need to serialize and deserialize ExternalId
.
Can I use Jackson and the same ObjectMapper
for that?
Because, for that, it would get kind of recursively defined:
val module = SimpleModule()
module.addKeySerializer(ExternalId::class.java, JacksonKeyDeserializers.Ser(mapper))
module.addKeyDeserializer(ExternalId::class.java, JacksonKeyDeserializers.Deser(mapper))
mapper.registerModule(module)
/**
* Serializes the key in Map<ExternalId, ...> into a JSON string.
* The model is not too clever, but that's what we have.
*/
class Ser(val mapper: ObjectMapper) : StdSerializer<ExternalId>(ExternalId::class.java) {
override fun serialize(value: ExternalId, gen: JsonGenerator, provider: SerializerProvider) {
gen.writeFieldName(mapper.writeValueAsString(value))
}
}
class Deser(val mapper: ObjectMapper) : KeyDeserializer() {
@Throws(IOException::class, JsonProcessingException::class)
override fun deserializeKey(key: String, ctxt: DeserializationContext): ExternalId {
return mapper.readValue(key.toByteArray(), ExternalId::class.java)
}
}
question from:
https://stackoverflow.com/questions/65930642/jackson-deserialize-map-key-which-is-another-json-entity 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…