我有几个POJO看起来像这样:
class Items {
List
我希望能够使用自定义格式序列化Item中的Date字段(在日期中添加前缀,例如“Date:xxx”),但我不想总是这样做(因为它被其他消费者使用)它不需要此前缀),仅在特定情况下.
如果我使用@JsonSerialize(使用= CustomDateSerializer.class)注释Item的getInsertionDate()我可能会使这个工作,但是,我不想这样做,因为我不总是想要使用此方法序列化此字段,仅在特定情况下.
理想情况下,我会在我想要自定义序列化的控制器中执行此操作:
@JsonSerialize(using = CustomDateSerializer.class)
public List
其中CustomDateSerializer扩展了SerializerBase< Date>并且Jackson会发现它应该使用默认的序列化程序序列化List中的每个项目,当它遇到Date对象时它应该使用我的自定义序列化程序.当然这不起作用,因为不是如何使用@JsonSerialize,但有没有办法让这个工作不是用包装器包装Item并在我想要自定义序列化时使用该包装器?我是否以错误的方式思考这个问题,还有另一种方法可以做到这一点吗?
请注意,我正在使用Spring MVC,所以我不是直接调用序列化.
任何帮助将非常感激 :)
最佳答案
问题是如果它是服务端点方法,杰克逊没有在getItems()上看到注释;它通常只传递类型List< Item>春天决定.使用JAX-RS(如Jersey),可以传递与该方法相关的注释(也许Spring也有一些方法);虽然它需要来自集成代码(对于JAX-RS,Jackson JAX-RS JSON提供程序模块)的更多支持来传递它.
实际创建单独的POJO(而不是传递List类型)可能更容易,以便您可以添加必要的注释.
如果您直接使用Jackson,您还可以使用ObjectWriter并指定要使用的默认日期格式.但是我不知道Spring是否允许你这样做(大多数框架都没有,只暴露了ObjectMapper的可配置性).
还有一个注意事项 – 您可以使用Dates(和Jackson 2.x)上的简单注释代替自定义序列化程序(和/或反序列化程序):
public class DateStuff {
@JsonFormat(shape=JsonFormat.Shape.STRING,pattern="'Date:'yyyy'-'MM'-'dd")
public Date date;
}
指定每个属性格式覆盖.