Analizar una matriz de objetos JSON no homogéneos con Jackson

karlson:

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.

la compensación:

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 @JsonTypeInfopara 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'}]

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=477134&siteId=1
Recomendado
Clasificación