Ahora estoy trabajando con Jackson y tengo algunas preguntas al respecto.Json deserialización en otra jerarquía de clases utilizando Jackson
Primero de todos. Tengo dos servicios, el primero es el servicio de recopilación y envío de datos y el segundo recibir estos datos y, por ejemplo, registrarlo en un archivo.
Así, el primer servicio tiene jerarquía de clases como esto:
+----ConcreteC
|
Base ----+----ConcreteA
|
+----ConcreteB
Y segundo servicio tiene jerarquía de clases como esto:
ConcreteAAdapter extends ConcreteA implements Adapter {}
ConcreteBAdapter extends ConcreteB implements Adapter {}
ConcreteCAdapter extends ConcreteC implements Adapter {}
El primer servicio no sabe nada sobre ConcreteXAdapter
.
La forma en que estoy enviando los datos en el primer servicio:
Collection<Base> data = new LinkedBlockingQueue<Base>()
JacksonUtils utils = new JacksonUtils();
data.add(new ConcreteA());
data.add(new ConcreteB());
data.add(new ConcreteC());
...
send(utils.marshall(data));
...
public class JacksonUtils {
public byte[] marshall(Collection<Base> data) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream() {
@Override
public byte[] toByteArray() {
return buf;
}
};
getObjectMapper().writeValue(out, data);
return out.toByteArray();
}
protected ObjectMapper getObjectMapper() {
return new ObjectMapper();
}
public Object unmarshall(byte[] json) throws IOException {
return getObjectMapper().readValue(json, Object.class);
}
public <T> T unmarshall(InputStream source, TypeReference<T> typeReference) throws IOException {
return getObjectMapper().readValue(source, typeReference);
}
public <T> T unmarshall(byte[] json, TypeReference<T> typeReference) throws IOException {
return getObjectMapper().readValue(json, typeReference);
}
}
Por lo tanto, quiero desirialize JSON en Colección de ConcreteXAdapter
, no en la Colección de ConcreteX
(ConcreteA -> ConcreteAAdapter, ConcreteB -> ConcreteBAdapter, ConcreteC -> ConcreteCAdapter
). En el caso que describí, quiero obtener:
Collection [ConcreteAAdapter, ConcreteBAdapter, ConcreteCAdapter]
¿Cómo puedo hacer esto?
¡Gracias por su rápida respuesta! Actualicé la pregunta. En resumen, el primer servicio no sabe nada sobre 'ConcreteXAdapter'. Entonces la pregunta es cómo decirle a Jackson que cree 'ConcreteXAdapter' si encuentra' ConcreteX' en json. – pbespechnyi
En este caso, sugeriría pasar el tipo manualmente (como "@type": "ConcreteA") y luego deserializar en el otro lado en función de la propiedad. Es decir. necesita implementar un serializador personalizado para esto. –
Así que no hay forma de hacerlo de la caja. ¡De acuerdo, gracias por la ayuda! – pbespechnyi