Contents

Jackson中@jsonformat指南

1. 概述

在本教程中,我们将演示如何在 Jackson 中使用*@JsonFormat*。 @JsonFormat是一个 Jackson 注解,我们使用它来指定如何格式化 JSON 输出的字段和/或属性。 具体来说,此注解允许我们指定如何根据SimpleDateFormat格式格式化**DateCalendar值。

2. Maven依赖

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

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

3. 入门

3.1. 使用默认格式

我们将首先演示将*@JsonFormat*注解与代表用户的类一起使用的概念。

由于我们要解释注解的细节,User对象将根据请求创建(而不是存储或从数据库加载)并序列化为 JSON:

public class User {
    private String firstName;
    private String lastName;
    private Date createdDate = new Date();
    // standard constructor, setters and getters
}

构建并运行此代码示例将返回以下输出:

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

正如我们所见,createdDate字段显示为自纪元以来的秒数,这是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"}

在这里,我们使用*@JsonFormat注解使用指定的SimpleDateFormat格式对createdDate*字段进行了格式化。 上面的示例演示了在字段上使用注解。我们也可以在 getter 方法(属性)中使用它。 例如,我们可能有一个在调用时计算的属性。在这种情况下,我们可以在 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. 指定形状

使用*@JsonFormat并将shape设置为JsonFormat.Shape.NUMBER会导致Date类型的默认输出 - 作为自 epoch 以来的秒数。 参数pattern*不适用于这种情况并被忽略:

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

让我们看看输出:

{ ..., "dateNum":1482054723876 }