mvc jsonview deserialize json spring model-view-controller serialization jackson

jsonview - jackson spring mvc



Serialización personalizada Jackson bajo Spring 3 MVC (1)

El problema es que Jackson no ve las anotaciones en getItems() si se trata de un método de punto final de servicio; por lo general, solo se pasa el tipo List<Item> que determina Spring. Con JAX-RS (como Jersey), las anotaciones asociadas con ese método se pasan, sin embargo (y quizás Spring también lo haga de alguna manera); aunque luego requiere un poco más de soporte del código de integración (para JAX-RS, módulo de proveedor Jackson JAX-RS JSON) para pasar eso.

Puede ser más fácil crear un POJO por separado (y no pasar los tipos de List ) para que pueda agregar las anotaciones necesarias.

Si usaba Jackson directamente, también podría usar ObjectWriter y especificar el formato de fecha predeterminado para usar. Pero no sé si Spring te permite hacer eso (la mayoría de los frameworks no lo hacen y solo exponen la configurabilidad de ObjectMapper ).

Una nota más: en lugar del serializador personalizado (y / o deserializador), también puede usar anotaciones simples con Date s (y en Jackson 2.x):

public class DateStuff { @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="''Date:''yyyy''-''MM''-''dd") public Date date; }

para especificar la anulación de formato por propiedad.

Tengo un par de POJO que se ve así:

class Items { List<Item> items; public List<Item> getItems() { return items; } ... } class Item { String name; Date insertionDate; ... }

Quiero poder serializar el campo Date en Item usando un formato personalizado (agregue un prefijo a la fecha, algo así como "Fecha: xxx"), pero no quiero hacer eso siempre (ya que es usado por otros consumidores) que no requieren este prefijo), solo en casos específicos.

Si getInsertionDate() la getInsertionDate() con @JsonSerialize(using = CustomDateSerializer.class) probablemente pueda hacer que esto funcione, sin embargo , no quiero hacer eso ya que no siempre quiero serializar este campo usando este método , solo en un caso específico.

Entonces, idealmente, haría esto en mi controlador que no quiere personalizar la serialización:

@JsonSerialize(using = CustomDateSerializer.class) public List<Item> getItems() { .... }

donde CustomDateSerializer extends SerializerBase<Date> y Jackson se daría cuenta de que debe serializar cada elemento en la List usando el serializador predeterminado, y cuando golpea un objeto Date debe usar mi serializador personalizado. Por supuesto, esto no funciona, ya que no es así como se usa @JsonSerialize , pero ¿hay alguna manera de hacer que esto funcione que no sea envolver el Item con un contenedor y usar ese contenedor cuando quiero la serialización personalizada? ¿Estoy pensando en esto de la manera incorrecta y hay otra manera de hacer esto?

Tenga en cuenta que estoy usando Spring MVC, así que no estoy llamando a la serialización directamente.

Cualquier ayuda sería muy apreciada :)