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.

Diferencia en la serialización de tipos polimórficos a JSON

Tengo una clase en la que he aplicado @JsonTypeInfo y JsonSubTypes de la siguiente manera:

public class RequestDto {
private List<IFoo> pageConfig = new ArrayList<>();
...
}


@JsonTypeInfo(
use = Id.NAME,
include = As.PROPERTY,
property = "iSlotType",
visible = true
)
@JsonSubTypes({
@Type(value = LSlot.class),
@Type(value = WSlot.class)
})
public interface IFoo {
...
}


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonTypeName("lSlot")
public class LSlot implements IFoo{
private String id;
}

Lo interesante es que cuando serializo un objeto de RequestDto, la serialización es como se espera:

{
"pageConfig": [
{
"iSlotType": "lSlot",
"id": "1001"
},
{
"iSlotType": "wSlot",
"id": "23",
"parentId": "34"
}
]
}

Pero cuando serializo solo la lista como:


objectMapper.writeValueAsString(requestDto.getPageConfig);

Obtengo la cadena sin los tipos de IFoo:


[
{
"id": "1001"
},
{
"id": "23",
"parentId": "34"
}
]

¿Cómo puedo obtener también el tipo de información aquí?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la información de tipo junto con la lista serializada de IFoo, puedes utilizar la clase TypeReference proporcionada por la biblioteca Jackson.

    Aquí tienes un ejemplo de código:

    TypeReference<><ifoo>> typeRef = new TypeReference<><ifoo>>() {};
    String serializedList = objectMapper.writerFor(typeRef).writeValueAsString(requestDto.getPageConfig());
    

    Este código serializará la lista con la propiedad iSlotType indicando el tipo de objetos IFoo.

    También puedes utilizar la clase ObjectWriter para personalizar las opciones de serialización según tus necesidades.

Comments are closed.