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"),但我不想一直这样做(因为它被其他消费者使用仅在特定情况下才需要此前缀.
如果我诠释Item
的getInsertionDate()
与@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,所以我不是直接调用序列化.
任何帮助将非常感激 :)
问题是 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)
指定每个属性的格式覆盖。
归档时间: |
|
查看次数: |
3316 次 |
最近记录: |