Jackson (JSON): Serialización de una variable de instancia con un nombre diferente según la implementación subyacente.
Tengo una clase (Mensaje) que tiene algunas variables de instancia. Una de estas variables es de tipo interfaz (MessageContent). Durante la serialización de esta clase a json, quiero serializar esta variable (contenido) con un nombre que dependa de la implementación. A continuación se muestra un fragmento de código para más detalles:
public class Message {
private String from;
private String to;
private MessageContent content;
// Getters & setters
}
public interface MessageContent {}
public class VideoMessage implements MessageContent {
private String videoUrl;
// Getters & setters
}
public class ImageMessage implements MessageContent {
private String imageUrl;
// Getters & setters
}
Mi requisito es que cuando se serialice un Mensaje y su contenido sea del tipo VideoMessage, el json serializado debería ser:
{
"from":123,
"to":345,
"video": {
"videoUrl":"una url"
}
}
Y cuando el contenido sea del tipo ImageMessage, el json serializado debería ser así:
{
"from":123,
"to":345,
"image": {
"imageUrl":"una url"
}
}
¿Cómo es posible a través de fasterxml jackson? Estoy usando el método writeValueAsString de ObjectMapper, pero no estoy seguro de cómo lograrlo. Intenté anotar ImageMessage y VideoMessage con anotaciones como @JsonTypeName y @JsonTypeInfo, pero no estoy seguro si eso es posible con ellos.
davy.ai
Puede cumplir con este requisito utilizando las anotaciones @JsonTypeInfo y @JsonSubTypes.
La anotación
@JsonTypeInfo
se utiliza para indicar el tipo de objeto de contenido, mientras que la anotación@JsonSubTypes
se utiliza para indicar los diferentes subtipos del objeto de contenido.Por ejemplo, puede anotar la interfaz
MessageContent
de la siguiente manera:Esto asegurará que el JSON serializado contenga una propiedad
type
que indique el tipo del objeto de contenido, y el valor de la propiedadtype
serávideo
oimage
dependiendo del tipo del objeto de contenido.Por ejemplo, el JSON serializado para un objeto
Message
con un contenidoVideoMessage
será:Y el JSON serializado para un objeto
Message
con un contenidoImageMessage
será: