es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = VideoMessage.class, name = "video"),
        @JsonSubTypes.Type(value = ImageMessage.class, name = "image")
    })
    public interface MessageContent {}
    

    Esto asegurará que el JSON serializado contenga una propiedad type que indique el tipo del objeto de contenido, y el valor de la propiedad type será video oimage dependiendo del tipo del objeto de contenido.

    Por ejemplo, el JSON serializado para un objeto Message con un contenido VideoMessage será:

    {
      "from":123,
      "to":345,
      "type": "video",
      "video": {
        "videoUrl":"alguna url"
      }
    }
    

    Y el JSON serializado para un objeto Message con un contenido ImageMessage será:

    {
      "from":123,
      "to":345,
      "type": "image",
      "image": {
        "imageUrl":"alguna url"
      }
    }
    

Comments are closed.