Tengo una situación donde tengo que analizar una serie de objetos JSON que no son idénticas.
Así por ejemplo:
[
{ "type": "type1", ..... type1 contents .... },
{ "type": "type2", ..... type2 contents .... },
....
{ "type": "type1", ..... type1 contents .... }
]
El número de tipos es limitado y el contenido de cada tipo son bien puede ser definido pero no es posible definir un único tipo de objeto que contendrá los contenidos.
¿Hay una manera de analizar con Jackson?
PS Estoy tratando de evitar escribir un analizador personalizado si puedo evitarlo.
yo usaría
com.fasterxml.jackson.databind.JsonNode
.
JsonNode parsed = objectMapper
.readValue("[{\"name\": \"a\"},{\"type\":\"b\"}]", JsonNode.class);
Esta clase tiene un montón de métodos de utilidad para trabajar.
O específica para las matrices se puede utilizar:
com.fasterxml.jackson.databind.node.ArrayNode
ArrayNode value = objectMapper
.readValue("[{\"name\": \"a\"},{\"type\":\"b\"}]", ArrayNode.class);
EDITAR
Lo sentimos, he leído mal su pregunta, se puede utilizar @JsonTypeInfo
para polimórfica serialización / deserialización:
public static void main(String args[]) throws JsonProcessingException {
//language=JSON
String data = "[{\"type\":\"type1\", \"type1Specific\":\"this is type1\"},{\"type\":\"type2\", \"type2Specific\":\"this is type2\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<BaseType> parsed = objectMapper.readValue(data, new TypeReference<List<BaseType>>() {});
System.out.println(parsed);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = Type1.class, name = "type1"),
@JsonSubTypes.Type(value = Type2.class, name = "type2")
})
static public abstract class BaseType {
public String type;
}
static public class Type1 extends BaseType {
public String type1Specific;
@Override
public String toString() {
return "Type1{" +
"type1Specific='" + type1Specific + '\'' +
'}';
}
}
static public class Type2 extends BaseType {
public String type2Specific;
@Override
public String toString() {
return "Type2{" +
"type2Specific='" + type2Specific + '\'' +
'}';
}
}
Estos son los documentos:
https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
Espero que esto ayude.
Y el resultado sería:
[Type1{type1Specific='this is type1'}, Type2{type2Specific='this is type2'}]