@JsonFormat
和 @JsonUnwrapped
是 Jackson 序列化/反序列化库中常用的注解,用于控制 Java 对象转换为 JSON 数据时的格式和结构。它们用于不同的目的,具体如下:
1. @JsonFormat
注解
-
用途:
@JsonFormat
用于定义 Java 对象的字段在序列化和反序列化为 JSON 时的格式。常用于日期、时间、数字等字段的格式化。 -
用法:
@JsonFormat
可以指定格式模式(如日期格式),时区等。它常用于日期时间字段,以便将 JavaDate
或LocalDateTime
格式化为特定的字符串格式,或将字符串解析回特定格式的日期对象。 -
常见属性:
pattern
:定义格式化的模式(如yyyy-MM-dd HH:mm:ss
)。timezone
:指定时区。shape
:指定数据的序列化形状(如JsonFormat.Shape.STRING
)。
-
示例:
public class User { private String name; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC") private LocalDateTime registrationDate; // Getter and Setter methods }
-
解释:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC")
:指定registrationDate
字段在序列化为 JSON 时的格式为"yyyy-MM-dd HH:mm:ss"
,并使用 UTC 时区。- 在序列化过程中,
LocalDateTime
对象将被转换为指定的字符串格式。在反序列化过程中,符合该格式的字符串也将被正确解析为LocalDateTime
对象。
-
使用场景:
- 格式化日期时间字段。
- 格式化数字(如 BigDecimal)。
2. @JsonUnwrapped
注解
-
用途:
@JsonUnwrapped
用于将 Java 对象的嵌套属性“展开”到 JSON 中,使得嵌套对象的字段直接在父级对象中显示,而不是嵌套为子对象。它主要用于消除 JSON 嵌套,使得 JSON 结构更加平坦(扁平化)。 -
用法:
@JsonUnwrapped
常用于那些包含另一个对象的 Java 对象,将嵌套对象的字段直接合并到父级对象的 JSON 表示中。 -
常见属性:
prefix
:为展开的字段添加前缀。suffix
:为展开的字段添加后缀。
-
示例:
public class Address { private String street; private String city; // Getter and Setter methods } public class User { private String name; @JsonUnwrapped private Address address; // Getter and Setter methods }
-
解释:
@JsonUnwrapped
注解在address
字段上。序列化时,address
中的字段将直接展开为User
的 JSON 字段,而不是作为一个嵌套的对象。- 输出示例:
{ "name": "John Doe", "street": "123 Main St", "city": "New York" }
- 如果没有
@JsonUnwrapped
注解,默认的 JSON 输出将是:{ "name": "John Doe", "address": { "street": "123 Main St", "city": "New York" } }
-
使用场景:
- 当你想要扁平化 JSON 结构并消除嵌套对象时。
3. 区别总结
特性 | @JsonFormat | @JsonUnwrapped |
---|---|---|
用途 | 用于定义字段的格式(如日期、时间、数字) | 用于将嵌套对象的字段“展开”到父级对象的 JSON 表示中 |
常见使用场景 | 格式化日期、时间、数字等基本类型 | 将嵌套对象的属性扁平化为父级对象的属性 |
常见属性 | pattern 、timezone 、shape | prefix 、suffix |
示例输出(有注解时) | 日期字段格式化为指定格式的字符串 | 嵌套对象的字段直接作为父级对象的 JSON 字段出现 |
示例输出(无注解时) | 使用默认的序列化格式(如 ISO-8601 的日期格式) | 嵌套对象作为一个单独的 JSON 对象出现 |
4. 总结
@JsonFormat
: 主要用于格式化输出(如日期、时间、数字),保证 Java 对象与 JSON 之间的数据格式一致性。@JsonUnwrapped
: 主要用于扁平化 JSON 结构,减少嵌套层级,使 JSON 数据更简洁。