vivo sigue michael maicol infierno esta dave java json polymorphism jackson deserialization

java - sigue - Deserialización polimórfica de Jackson: ¿puede requerir la existencia de un campo en lugar de un valor específico?



michael jackson sigue vivo 2018 (1)

Si no estás casado con Jackson, creo que se puede lograr algo similar con FlexJSON.

http://flexjson.sourceforge.net/javadoc/flexjson/JSONDeserializer.html

No estoy familiarizado con los métodos de Jackson para hacer cosas similares, pero puedo decir que FlexJSON es muy eficiente y generalmente intuitivo de usar durante los pasos de serialización / deserialización.

Usando un giro en el ejemplo del zoológico:

public class ZooPen { public String type; public List<Animal> animals; } public class Animal { public String name; public int age; } public class Bird extends Animal { public double wingspan; }

Deseo utilizar la deserialización polimórfica para construir instancias de Animal si no se especifica una envergadura, y las instancias de Bird si es así. En Jackson, la deserialización sin tipo generalmente se ve así:

@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "wingspan", visible = true, defaultImpl = Animal.class ) @JsonSubTypes({ @Type(value = Bird.class, name = **???**) }) public class Animal { ... }

El valor de envergadura puede ser cualquier cosa, y sin eso que coincida con algo específicamente, Jackson recurre a la clase defaultImpl.

Probablemente podría usar @JsonCreator

@JsonCreator public static Animal create(Map<String,Object> jsonMap) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); if (jsonMap.get("wingspan") == null) { // Construct and return animal } else { // Construct and return bird } }

Sin embargo, entonces tengo que manejar manualmente los valores adicionales y lanzar excepciones consistentes, y no está claro si el Animal se serializaría correctamente más tarde.

¿Hay alguna manera de hacer lo que quiero con el manejo de tipos polimórficos? Parece que puedo usar mi propio TypeResolver o TypeIdResolver, pero parece ser más trabajo que simplemente deserializar el json en bruto. Alternativamente, podría haber una forma de apuntar al tipo de zoo pluma, aunque esté en el objeto principal. ¿Algunas ideas?

Editar:
TypeResolver y TypeIdResolver parecen suponer intrínsecamente que la información de tipo está serializada, por lo que no son buenos para usar. ¿Sería factible implementar mi propio JsonDeserializer que se enganche en el ciclo de vida para especificar el tipo, pero todavía utiliza la funcionalidad básica de procesamiento de anotación de jackson? He estado JsonDeserializer.deserializeWithType(...) un vistazo a JsonDeserializer.deserializeWithType(...) , pero eso parece delegar totalmente la deserialización en un TypeDeserializer. También existe el problema de que necesitaría deserializar algunos objetos antes de saber qué tipo usar.