Cómo deserializar una matriz JSON con diferentes tipos?
Tengo una matriz JSON como esta:
[
"0",
{
"number": 1,
"field": "value"
},
{
"number": 2,
"field": "value"
}
]
El primer elemento de la matriz es una cadena.
¿Es posible deserializarlo con FasterXML Jackson?
Sé cómo hacerlo con diferentes objetos.
Necesito usar @JsonSubTypes
(Aquí hay un ejemplo https://stackoverflow.com/a/38877862/2564509)
El problema con esta matriz es que el primer elemento es de tipo String.
davy.ai
Sí, es posible deserializar este array JSON utilizando FasterXML Jackson. Como se mencionó, el primer elemento del array es una cadena, que debe ser manejada por separado del resto de los elementos del array.
Una forma de lograr esto es utilizando
@JsonSubTypes
para especificar las diferentes subclases a las que puede pertenecer el objeto JSON. Por ejemplo, podemos definir una clase base y dos subclases de la siguiente manera:Ahora, podemos crear un deserializador personalizado para el array JSON que comprueba el tipo del primer elemento y deserializa el resto del array en consecuencia. Aquí tienes un ejemplo:
Este deserializador primero verifica el tipo del primer elemento del array JSON. Si es una cadena “0”, deserializa el resto del array como objetos
StringItem
. De lo contrario, deserializa el resto del array como objetosNumberItem
utilizando unObjectMapper
separado.Podemos aplicar este deserializador personalizado al array JSON anotando el campo del array con
@JsonDeserialize(using = ItemArrayDeserializer.class)
:Ahora, podemos deserializar el array JSON de la siguiente manera:
java
</item[]>ObjectMapper mapper = new ObjectMapper();
ItemArray itemArray = mapper.readValue(jsonString, ItemArray.class);