使用 Jackson 序列化和反序列化枚举

2025年03月17日 | 阅读 9 分钟

在本节中,我们将了解如何使用 Jackson 2 序列化和反序列化Java 枚举。 在 Java 中,枚举是一组用于定义类类型的命名常量。 就像 Java 类一样,Java 枚举也可以有方法、构造函数和实例变量。 Java 枚举是通过使用 enum 关键字创建的。

控制枚举表示

让我们使用 enum 关键字并了解我们如何定义枚举

Shape.Java

Distance.Java

将枚举序列化为 JSON

为了序列化 Enum,我们借助 ObjectMapper 类。 我们使用 ObjectMapper 类的 writeValueAsString() 方法来序列化 Enum。 如果我们使用 writeValueAsString() 方法序列化 Enum,它将 Java 枚举表示为简单的字符串。

SerializeEnumExample1.java

输出

Serialize and Deserialize Enums with Jackson

但是,如果我们将 Enum 编组为 JSON 对象,它将 Enum 表示为正确的 JSON 字符串。 我们只需要通过使用 @JsonFormat 并以以下方式将字段设为 public 来更改 Distance.java

Distance.java

现在,如果我们运行 SerializeEnumExample1.java 类,它将结果表示为以下 JSON 字符串格式

输出

Serialize and Deserialize Enums with Jackson

枚举和 @JsonValue

通过使用 @JsonValue 注解,我们还可以控制枚举的编组输出。 我们只需在 getter 函数上添加 @JsonValue 注解。 在我们的 Distance.java 类中,我们通过使用 @JsonValue 注解添加一个 getter 方法。 让我们看看更新后的 Distance.java 类

Distance.java

现在,如果我们运行 SerializeEnumExample1.java 类,它将结果表示为以下格式

输出

Serialize and Deserialize Enums with Jackson

枚举的自定义序列化器

自定义序列化器 是控制枚举编组输出的另一种方式。 当我们使用旧版本的 Jackson 或者我们需要对枚举进行更多自定义时,我们会使用自定义序列化器。

首先让我们为 Distance 枚举创建自定义序列化器

DistanceCustomSerializer.java

现在,我们通过使用 @JsonSerialize 注解,使用 DistanceCustomSerializer 修改 Distance.java 类。 让我们看看更新后的 Distance.java 类。

Distance.java

现在,如果我们运行 SerializeEnumExample1.java 类,它将结果表示为以下格式

输出

Serialize and Deserialize Enums with Jackson

将 JSON 反序列化为枚举

首先让我们了解 Jackson 的默认行为。 默认情况下,Jackson 使用枚举名称从 JSON 反序列化。

我们有以下 JSON 字符串要反序列化

现在,我们将上面的字符串反序列化为 Distance.INCH 对象。

让我们通过一个例子来了解反序列化是如何完成的。

Distance.java

DeserializeEnumExample1.java

输出

Serialize and Deserialize Enums with Jackson

使用 @JsonValue 注解将 JSON 字符串反序列化为枚举

@JsonValue 注解是我们可用于序列化和反序列化枚举的注解之一。 枚举值是常量,因此,@JsonValue 注解可用于两者。

首先,我们通过使用 @JsonValue 注解将 getter 方法添加到我们的 Distance.java。

Distance.java

我们有以下 JSON 字符串要反序列化

现在,我们将上面的字符串反序列化为 Distance.INCH 对象。

让我们通过一个例子来了解反序列化是如何完成的。

DeserializeEnumExample2.java

输出

Serialize and Deserialize Enums with Jackson

使用 @JsonProperty 注解将 JSON 字符串反序列化为枚举

将 JSON 字符串反序列化为枚举的另一种方法是使用 @JsonProperty 注解。 为了反序列化 JSON 字符串,我们以以下方式在枚举实例上使用 @JsonProperty 注解

Distance.java

DeserializeEnumExample3.java

输出

Serialize and Deserialize Enums with Jackson

使用 @JsonCreator 注解将 JSON 字符串反序列化为枚举

@JsonCreator 是我们可用于反序列化枚举的另一个注解。 所有由 @JsonCreator 注解的方法都由 Jackson 调用,以获取封闭类的实例。 为了通过使用 @JsonCreator 将 JSON 字符串反序列化为枚举,我们将定义带有 @JsonCreator 注解的 forValues() 工厂方法。

Distance.java

我们有以下 JSON 字符串要反序列化

现在,我们将上面的字符串反序列化为 Distance.INCH 对象。

让我们通过一个例子来了解反序列化是如何完成的。

DeserializeEnumExample4.java

输出

Serialize and Deserialize Enums with Jackson

使用自定义反序列化器将 JSON 字符串反序列化为枚举

这是将 JSON 字符串反序列化为枚举的最后一种方法,当上述讨论的技术未能反序列化 JSON 字符串时,我们会使用这种方法。

当我们使用旧版本的 Jackson 或我们无法访问 Enum 时,我们会使用自定义反序列化器。

我们使用自定义反序列化器反序列化以下 JSON 字符串

DistanceCustomDeserializer.java

现在,如果我们运行 DeserializeEnumExample4.java 类,它将结果表示为以下 JSON 字符串格式

输出

Serialize and Deserialize Enums with Jackson