2011-12-19 37 views
13

¿Jackson con Jersey admite clases polimórficas sobre JSON?Polimorfismo en JSON, Jersey y Jackson

Digamos, por ejemplo, que tengo una clase para padres y una clase para niños que hereda de ella. Y, digamos que quiero usar JSON para enviar & recibir Parent y Child sobre HTTP.

public class Parent { 
... 
} 

public class Child extends Parent { 
... 
} 

He pensado en este tipo de aplicación:

@Consumes({ "application/json" }) // This method supposed to get a parent, enhance it and return it back 
    public @ResponseBody 
    Parent enhance(@RequestBody Parent parent) { 
    ... 
    } 

Pregunta: ¿Si le doy esta función (a través de JSON, por supuesto) un objeto secundario, ¿funcionará? ¿Serán serializados también los campos de miembros adicionales del Niño? Básicamente, quiero saber si estos marcos admiten el consumo polimórfico & responder.

BTW, estoy trabajando con Spring MVC.

Respuesta

11

Jackson hace polimorfismo de apoyo,

En su annotate clase hija con un nombre:

@JsonTypeName("Child_Class") 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "objectType") 
public class Child extends Parent{ 
.... 
} 

En matriz se especifica subtipos:

@JsonSubTypes({ @JsonSubTypes.Type(value = Child.class), @JsonSubTypes.Type(value = SomeOther.class)}) 
public class Parent { 
    .... 
} 
+0

Gran respuesta Usman. Sin embargo, probablemente desee @JsonTypeInfo en el padre en vez de en los hijos. –

+0

Podríamos hacerlo de esa manera también, en cuyo caso tendríamos que poner nombre en la anotación JsonSubTypes algo así como la respuesta aquí: http://stackoverflow.com/questions/11798394/polymorphism-in-jackson-annotations-jsontypeinfo- uso –

+0

¿Funcionará en Jersey 2 (por ejemplo, 2.9.1)? –

Cuestiones relacionadas