在Spring 3 MVC下的Jackson自定义序列化

The*_*uck 6 model-view-controller serialization spring json jackson

我有几个POJO看起来像这样:

class Items {
    List<Item> items;

    public List<Item> getItems() {
        return items;
    }

    ...
}

class Item {
    String name;
    Date insertionDate;

    ...
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使用自定义格式序列化Date字段Item(在日期中添加前缀,例如"Date:xxx"),但我不想一直这样做(因为它被其他消费者使用仅在特定情况下才需要此前缀.

如果我诠释ItemgetInsertionDate()@JsonSerialize(using = CustomDateSerializer.class)我也许可以做这项工作,但是,我不想这样做,因为我不总是想用这种方法来序列化这一领域,只能在特定的情况下.

理想情况下,我会在我想要自定义序列化的控制器中执行此操作:

@JsonSerialize(using = CustomDateSerializer.class)
public List<Item> getItems() {
   ....
}
Run Code Online (Sandbox Code Playgroud)

哪里CustomDateSerializer extends SerializerBase<Date>和杰克逊会发现它应该List使用默认的序列化程序序列化每个项目,当它遇到一个Date对象时它应该使用我的自定义序列化程序.当然这不起作用,因为那不是如何@JsonSerialize使用,但有没有办法让这个工作,而不是包装Item一个包装器,并在我想要自定义序列化时使用该包装器?我是否以错误的方式思考这个问题,还有另一种方法可以做到这一点吗?

请注意,我正在使用Spring MVC,所以我不是直接调用序列化.

任何帮助将非常感激 :)

Sta*_*Man 2

问题是 Jackson 没有看到关于getItems()它是否是服务端点方法的注释;它通常只是List<Item>Spring 确定的传递类型。然而,使用 JAX-RS(如 Jersey),可以传递与该方法关联的注释(也许 Spring 也有某种方法);尽管它随后需要集成代码(对于 JAX-RS、Jackson JAX-RS JSON 提供程序模块)提供更多支持来传递该信息。

实际上创建一个单独的 POJO(而不是传递类型)可能更容易,List以便您可以添加必要的注释。

如果您直接使用 Jackson,您还可以使用ObjectWriter并指定要使用的默认日期格式。但我不知道Spring是否允许你这样做(大多数框架不允许并且只公开了可配置性ObjectMapper)。

Date还有一点需要注意——您还可以使用带有s 的简单注释(以及 Jackson 2.x 上的),而不是自定义序列化器(和/或反序列化器) :

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

指定每个属性的格式覆盖。