Jackson 中的反序列化注解

17 Mar 2025 | 6 分钟阅读

当我们将 JSON 字符串反序列化为对象时,会使用反序列化注解。Jackson 库提供了几个反序列化注解,例如 @JsonCreator、@JacksonInject、@JsonAnySetter 等。 这些注解主要用于 setter 方法

Deserialization Annotations in Jackson

让我们通过一个例子来逐一理解它们。

@JsonCreator

@JsonCreator 注解是用于微调工厂方法或构造函数(即用于反序列化)的最常用的反序列化注解之一。我们还使用 @JsonProperty 注解来使用 @JsonCreator 注解。

让我们举个例子来理解我们如何将其与 @JsonProperty 注解一起使用。

JsonCreatorExample.java

输出

Deserialization Annotations in Jackson

@JacksonInject

另一个重要的反序列化注解用于插入属性值,而不是从 Json 输入解析它。

让我们看一个例子,在这个例子中,我们将使用 @JacksonInject 注解将值插入到对象中,而不是从 Json 中解析。

JacksonInjectExample.java

输出

Deserialization Annotations in Jackson

@JsonAnySetter

@JsonAnySetter 是另一个重要的反序列化注解,我们在反序列化 Json 时使用它。它类似于 @JsonAnyGetter 注解。

它们之间唯一的区别是,@JsonAnySetter 允许 setter 方法返回一个 Map,我们用它来反序列化,而 @JsonAnyGetter 允许 getter 方法做同样的事情,但返回的 map 用于序列化。返回的 map 用于以与其他属性相同的方式反序列化 JSON 的附加属性。

让我们举个例子来理解该注解的工作原理。

JsonAnySetterExample.java

输出 1

Deserialization Annotations in Jackson

如果我们不使用 @JsonAnySetter 注解,我们的代码将为 Id、NameEmail 字段抛出 UnrecognizedPropertyException

输出 2

Deserialization Annotations in Jackson

当我们在 setter 方法中添加 @JsonAnySetter 注解时,我们的代码将执行,没有任何错误。

@JsonSetter

@JsonSetter 是另一个反序列化注解,我们也在反序列化 Json 时使用它。它类似于 @JsonGetter 注解。

它们之间唯一的区别是,@JsonGetter 用于序列化 JSON 的附加属性,而 @JsonSetter 用于反序列化 JSON 的附加属性。

让我们举个例子来理解该注解的工作原理。

JsonSetterExample.java

输出

Deserialization Annotations in Jackson

如果我们不使用 @JsonSetter 注解,我们的代码将为 facId, facNamefacEmail 字段抛出 UnrecognizedPropertyException

输出 2

Deserialization Annotations in Jackson

当我们在 setter 方法中添加 @JsonSetter 注解时,我们的代码将执行,没有任何错误。

@JsonDeserialize

这是一个重要的反序列化注解,我们用它来定义一个自定义的反序列化器,用于反编组 json 对象。

让我们举个例子来理解它如何帮助反序列化 Json。

JsonDeserializerExample.java

输出

Deserialization Annotations in Jackson

@JsonEnumDefaultValue

这是一个重要的反序列化注解,我们在使用 Enum 时使用它。它主要用于我们需要使用默认值反序列化未知枚举值时。

让我们举个例子来理解它如何帮助反序列化 Json。

JsonDeserializerExample.java

输出

Deserialization Annotations in Jackson