polymorphic jsonproperty defaulttyping java json polymorphism jackson

java - jsonproperty - Deserialización polimórfica de Jackson



jackson polymorphic (1)

Tengo el siguiente problema con Jackson y escriba la jerarquía. Estoy serializando un SubA clase que extiende Base a una String , y luego trato de deserializarlo. Por supuesto, en el momento de la compilación, el sistema no sabe si será Base o SubA así que estoy esperando una Base y luego haré otras operaciones, si es un SubA .

Mi clase Base ve así:

@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @Type(value = SubA.class, name = "SubA") }) public class Base { protected String command; // +get +set protected String type; // +get +set }

... y una clase derivada de Base :

@JsonTypeName("SubA") public class SubA extends Base { private AnotherClass anotherClass; // +get +set private String test; // +get +set @JsonIgnore @Override public String getType() { return "SubA"; } }

... y estoy tratando de ejecutar el siguiente código:

ObjectMapper mapper = new ObjectMapper(); ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); Base payload = new SubA(); // + setting anotherClass as well as test variables String requestStringSend = ow.writeValueAsString(payload); System.out.println("Sending: " + requestStringSend); Base received = mapper.readValue(requestStringSend, Base.class); String requestStringReceived = ow.writeValueAsString(received); System.out.println("Received: " + requestStringReceived);

El String requestStringSend es:

Sending: { "command" : "myCommand", "type" : "SubA", "anotherClass" : { "data" : "someData" }, "test" : "test123" }

Pero sigo recibiendo el mismo error una y otra vez. El asignador ahora sabe qué hacer con el parámetro anotherClass - no existe en Base . ¿Pero pensé que el mapeador lo convertiría en una clase SubA ?

Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "anotherClass" (Class com.test.Base), not marked as ignorable at [Source: java.io.StringReader@1256ea2; line: 4, column: 21] (through reference chain: com.test.Base["anotherClass"]) at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53) at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267) at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:649) at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:635) at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1355) at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:717) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1854) at com.test.Foo.main(Foo.java:32)

Eché un vistazo a las siguientes preguntas / recursos:


Tu código parece correcto para el caso de uso. Un posible problema es que podrías estar usando accidentalmente las anotaciones de Jackson 2 con Jackson 1 ObjectMapper (puedo ver que Jackson es el último de los nombres de los paquetes en la excepción). La versión de las anotaciones y el mapeador debe coincidir; de lo contrario, las anotaciones serán ignoradas, y esto explicaría los problemas que estás viendo.