stdserializer serialize jsonserialize example deserializer custom java annotations jackson

java - jsonserialize - spring boot serialize to json



Crear un deserializador tipo Jackson enterado (1)

Quiero configurar un deserializador Jackson que actúe de manera diferente según el tipo de objetivo del campo anotado.

public class Car { @JsonSerialize(using=IdSerializer.class) @JsonDeserialize(using=IdDeserializer.class) String id } public class Bus { @JsonSerialize(using=IdSerializer.class) @JsonDeserialize(using=IdDeserializer.class) Id id }

Los serializadores de Jackson saben de qué tipo están convirtiendo los datos, así que esto funciona:

public class IdSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGen, SerializerProvider provider) throws IOException { // value is the annotated field class if(value instanceof String) jsonGen.writeObject(...); else if (value instanceof Id) jsonGen.writeObject(...); else throw new IllegalArgumentException(); } }

Los deserializadores de Jackson parecen no saber el tipo de destino en el que convertirá los datos:

public class IdDeserializer extends JsonDeserializer<Object> { @Override public Object deserialize(JsonParser jp, DeserializationContext context) throws IOException { // what is the annotated field class? } }


En el serializador, puede agregar información adicional sobre el tipo que lo ayudará durante la deserialización.

Construyendo desde su IdSerializer publicado ...

public class IdSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGen, SerializerProvider provider) throws IOException { // value is the annotated field class if(value instanceof String){ jsonGen.writeStartObject(); jsonGen.writeFieldName("id"); jsonGen.writeObject(value); jsonGen.writeFieldName("type"); jsonGen.writeString("String"); jsonGen.writeEndObject(); } else if (value instanceof Id){ Id id = (Id) value; jsonGen.writeStartObject(); jsonGen.writeFieldName("id"); jsonGen.writeString(id.getStuff()); jsonGen.writeFieldName("type"); jsonGen.writeString("Id"); jsonGen.writeEndObject(); } else{ throw new IllegalArgumentException(); } } }

En su deserializador, puede analizar este campo ''tipo'' y devolver un Objeto del tipo apropiado.