gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:46:03 24 4
gpt4 key购买 nike

我有几个 POJO,如下所示:

class Items {
List<Item> items;

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

...
}

class Item {
String name;
Date insertionDate;

...
}

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

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

所以理想情况下,我会在我想要自定义序列化的 Controller 中执行此操作:
@JsonSerialize(using = CustomDateSerializer.class)
public List<Item> getItems() {
....
}

在哪里 CustomDateSerializer extends SerializerBase<Date> Jackson 会发现它应该序列化 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;
}

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

关于json - Spring 3 MVC下的Jackson自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com