1. 概述

本文我们将学习如何使用 Jackson 中 @JsonFormat 注解来自定义格式化JSON输出字段。

2. Maven 依赖

@JsonFormat 是在 jackson-databind 包中定义的,因此我们需要以下 Maven 依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>

3. 开始

3.1. 默认格式

为了方便演示,这里我们定义一个 User 类:

public class User {
    private String firstName;
    private String lastName;
    private Date createdDate = new Date();

    // standard constructor, setters and getters
}

JSON 序列化后输出结果:

{"firstName":"John","lastName":"Smith","createdDate":1482047026009}

如上所示,createdDate 字段显示Linux时间戳,这是 Date 字段的默认格式。

3.2. 在 Getter 方法上使用注解

现在让我们使用 @JsonFormat 来指定如何序列化 createdDate 字段的格式。下面是更新后的 User 类,createdDate 字段已经被注解来指定日期格式。

pattern 参数所使用的日期格式由 SimpleDateFormat 指定:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ")
private Date createdDate;

然后,重新构建并运行项目。输出结果如下:

{"firstName":"John","lastName":"Smith","createdDate":"2016-12-18@07:53:34.740+0000"}

我们也可以直接注解在 Getter 方法上:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date getCurrentDate() {
    return new Date();
}

输出结果如下:

{ ... , "currentDate":"2016-12-18", ...}

3.3. 指定时区

也可自定义时区:

@JsonFormat(
  shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ", locale = "en_GB")
public Date getCurrentDate() {
    return new Date();
}

3.4. 指定 Shape

当 @JsonFormat 中 shape 设置为 JsonFormat.Shape.NUMBER 时,Date 类型会默认输出为linux时间戳(秒数),此时 pattern 参数会自动无效并忽略。

@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public Date getDateNum() {
    return new Date();
}

输出结果如下所示:

{ ..., "dateNum":1482054723876 }

4. 总结

总之,@JsonFormat 用于控制 Date 和 Calendar 类型的输出格式,就像上面所示的示例代码一样。

最后,文中代码可在 GitHub 中找到。