example - objectmapper java
No se puede(de) serializar una lista con elementos polimórficos en Jackson (1)
No hay forma de asignar JSON que muestre automáticamente; no es uno de los 4 tipos admitidos por Jackson.
Si no puede hacer que el servidor produzca una estructura más estándar (para la cual existe soporte automático), necesitará escribir un deserializador personalizado; o para enlazar datos en dos pasos, primero en una estructura intermedia fácilmente mapeable (como JsonNode
o Map
) y luego desde allí a la estructura deseada extrayendo manualmente el tipo, usando eso (por ejemplo, con ObjectMapper.convertValue(object, resultType)
.
Tengo un problema (de) serialización de JSON que no he definido.
Aquí hay algunos códigos y JSON que explican el problema:
Código:
public static class Base {
public String klass = "base";
}
public static class SubBase extends Base {
}
public static class Sub1 extends SubBase {
public Sub1() {
klass = "Sub1";
}
}
public static class Sub2 extends SubBase {
public Sub2() {
klass = "Sub2";
}
}
public static class Holder {
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_ARRAY, property="type")
@JsonSubTypes({@JsonSubTypes.Type (name = "sub1", value = Sub1.class),@JsonSubTypes.Type(name = "sub2", value = Sub2.class)})
public List<Base> items = new ArrayList<Base>();
}
Holder holder = new Holder();
holder.items.add(new Sub1());
holder.items.add(new Sub1());
mapper.writeValueAsString(holder);
produce
{"items":[["sub1",{"klass":"Sub1"}],["sub1",{"klass":"Sub1"}]]}
Si cambio la anotación JsonTypeInfo a
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT, property="type")
produce
{"items":[{"sub1":{"klass":"Sub1"}},{"sub1":{"klass":"Sub1"}}]}
Hasta ahora, todo está bien :)
Sin embargo, el JSON que obtengo del servidor tiene una estructura ligeramente diferente:
{"type":"sub1", "items":[{"klass":"Sub1"},{"klass":"Sub1"}]}
Donde el tipo de la matriz de elementos se define en la propiedad "tipo" (tenga en cuenta que todos los elementos en la matriz "artículos" son de la misma clase).
Simplemente no puedo entender qué combinación de JsonTypeInfo usar para que esto suceda. Intenté configurar el ''incluir'' en ".EXTERNAL_PROPERTY", pero esto no funciona.
Deserializar usando esta inclusión me da el mensaje de error principal "org.codehaus.jackson.JsonGenerationException:" No se puede escribir un nombre de campo, esperando un valor " Exception in thread" .
Mi pregunta es: ¿Qué anotación necesito usar para que '' {"tipo": "sub1", "elementos": [{"klass": "Sub1"}, {"klass": "Sub1"}]} '' llenará la matriz ''artículos'' con todas las instancias Sub1 basadas en la propiedad " tipo " del Titular?
Si esto simplemente no es posible, ¿hay alguna otra manera de lograr esto (sin la necesidad de un serializador personalizado para Holder, un serializador personalizado solo para la matriz de ''elementos'' estaría bien)?
¡Gracias!