6

我有几个 POJO,如下所示:

class Items {
    List<Item> items;

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

    ...
}

class Item {
    String name;
    Date insertionDate;

    ...
}

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

Item如果我用'sgetInsertionDate()进行注释,@JsonSerialize(using = CustomDateSerializer.class)我可能可以完成这项工作,但是,我不想这样做,因为我并不总是想使用这种方法序列化这个字段,只在特定情况下。

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

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

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

请注意,我使用的是 Spring MVC,所以我没有直接调用序列化。

任何帮助将非常感激 :)

4

1 回答 1

2

问题是杰克逊没有看到关于getItems()它是否是服务端点方法的注释;它通常只传递List<Item>Spring 确定的类型。然而,使用 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;
}

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

于 2013-01-03T19:06:03.623 回答