为 Jackson 自定义序列化对象的 JSON 格式

伴随着 Play1, 我们原来使用的 JSON 库是 Gson. 回忆下 Gson 是怎么自定义序列化对象的 JSON 格式,大概是这样子的

GsonBuilder()..registerTypeHierarchyAdapter(Cat.class, new Cat());

然后 Cat 需要实现 JsonSerializer 的 serialize() 方法。

来到了 Play2 中,JSON 库变成了 Jackson,那么 Jackson 该如何为对象自定义 JSON 格式呢?

例如,默认时 Jackson 对 Map 类型输出的是一个 JSON 对象

Map("key1"->"value1", "key2"->"value2")     转换成 JSON 是 {"key1":"value1", "key2":"value2"}

当为适应某些客户端,对于 LinkedHashMap 类型,我们想要输出的是一个有序的 JSON 数组: [{"key1":"value1"},{"key2":"value2"}]

我们就应该自定义某些 Map 的序列化格式,实现方法有两种,addSerializer 和 @JsonSerialize,不管哪种方式都需事先具体化 JsonSerializer 类,并实现它的 serialize 抽象方法

所以我先来实现一个能序列化 Map 的 JsonArrayMapSerializer 类

上面调用了 JsonGenerator 的 writeXxx() 方法来输出 JSON 格式

接着看两种实现方式

1. addSerializer() 方式

我采用了 Scala 来书写测试代码, 贴代码也有点问题,所以用图片代替

Jackson_serializer_3
测试结果:

Jackson_serializer_2

2. @JsonSerialize 注解方式

看下注解 @JsonSerialize 的定义

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})

它可以作用在注解,方法,字段,类型和参数上。我们举两个例子,分别是对类型和字段使用此注解

1)自定义的 JsonArrayMap 类型

2) 作用在字段上

用测试用例来验证下:

测试结果

Jackson_serializer_1

可以进一步考虑让 @JsonSerialize 应用在别处,如方法参数,getter 方法上。

本文链接 https://yanbin.blog/jackson-custom-serialize-json-format/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments