Jackson中的序列化注解

2025年3月17日 | 阅读13分钟

当我们将Java对象序列化为Json字符串时,会使用序列化注解。Jackson库提供了几种序列化注解,例如 @JsonSerialize、@JacksonGetter、@JsonAnyGetter等。

Serialization Annotations in Jackson

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

@JsonAnyGetter

@JsonAnyGetter 是最重要的注解之一,用于以与其他属性相同的方式序列化JSON的附加属性。 该注解允许getter方法返回一个Map,然后我们将其用于序列化。 JsonAnyGetter注解用于序列化,这意味着它属于 序列化注解 的类别。

让我们看两个例子来理解 @JsonAnyGetter 注解。 在第一个例子中,我们将在不使用注解的情况下将Java对象转换为JSON。 在第二个例子中,我们通过使用注解来理解 @JsonAnyGetter 注解的用法。

JsonAnyGetterExample1.java

输出

Serialization Annotations in Jackson

JsonAnyGetterExample2.java

输出

Serialization Annotations in Jackson

说明

第一个例子中,输出带有 facultyData 头部,因为我们没有使用 @JsonAnyGetter 注解。 在第二个例子中,输出只带有Id、Name和Email值。 输出中没有 facultyData 头部,因为我们在那里使用了 @JsonAnyGetter 注解。

@JsonGetter

@JsonGetter 是另一个最重要的注解,用于序列化JSON的附加属性。 它类似于 @JsonProperty 注解,允许将特定方法标记为getter方法。 @JsonGetter 注解也用于序列化,所以它属于 序列化注解

让我们看两个例子来理解 @JsonGetter 注解。 在第一个例子中,我们将在不使用注解的情况下将Java对象转换为JSON。 在第二个例子中,我们通过使用注解来理解 @JsonGetter 注解的用法。

JsonGetterExample1.java

输出

Serialization Annotations in Jackson

JsonGetterExample2.java

输出

Serialization Annotations in Jackson

说明

在第一个例子中,每个变量名都以faculty前缀开头,因为我们没有使用 @JsonGetter 注解。 在第二个例子中,变量名没有前缀(faculty)值。

@JsonPropertyOrder

@JsonPropertyOrder 是Jackson的另一个重要注解。 它用于在序列化JSON对象时保留特定的顺序。 它也用于序列化,所以它也属于 序列化注解

让我们看两个例子来理解 @JsonPropertyOrder 注解。 两个代码的逻辑和功能相似。 它们之间唯一的区别是,在第一个代码中,我们没有使用 @JsonPropertyOrder,而在第二个代码中,我们使用了它。

JsonPropertyOrderExample1.java

输出

Serialization Annotations in Jackson

JsonPropertyOrderExample2.java

输出

Serialization Annotations in Jackson

说明

在第一个例子中,输出带有字段的默认顺序,因为我们没有使用 @JsonPropertyOrder。 在第二个例子中,输出带有我们在 @JsonPropertyOrder 中定义的字段的顺序。 因此,JsonProprtyOrder注解用于以指定的顺序获取结果字段。

@JsonRawValue

@JsonRawValue 是Jackson的另一个重要注解,用于序列化对象。 它用于在不进行转义或任何修饰的情况下序列化文本。 它也属于 序列化注解

让我们看一些例子来理解 @JsonRawValue 注解的用法,我们在这些例子中编写了有和没有 @JsonRawValue 注解的代码。

JsonRawValueExample1.java

输出

Serialization Annotations in Jackson

JsonRawValueExample2.java

输出

Serialization Annotations in Jackson

说明

在第一个例子中,json字段的值带有修饰,因为我们没有使用 @JsonRawValue 注解。 然而,在第二个例子中,json字段的值在没有转义或修饰的情况下出现,因为我们使用了 @JsonRawValue 注解。 因此,这些值没有斜杠(/)。

@JsonValue

@JsonValue 是最常用和最重要的注解之一,它用于通过使用其单个方法序列化单个对象。

让我们看一个例子来理解如何使用注解来序列化对象

JsonValueExample1.java

输出

Serialization Annotations in Jackson

@JsonRootName

@JsonRootName 注解是最重要的注解之一,用于指示应该序列化的POJO的名称。 简单来说,它用于包装一个对象,以便使用顶层元素进行序列化。 它也属于 序列化注解 的范畴。

我们将名称作为参数传递给注解。 我们还使用 "WRAP_ROOT_VALUE",即SerializationFeature枚举的特性。 我们启用它,以便在单个属性JSON对象中包装路由值,其中键是路由名称。

让我们看一个 @JsonRootName 的例子来理解它是如何工作的

JsonRootNameExample.java

输出

Serialization Annotations in Jackson

@JsonSerialize

@JsonSerialize 是在序列化Java对象时最常用的注解之一。 它用于为编组Json对象定义一个自定义序列化器。

让我们看一个例子来理解它如何帮助序列化一个对象。

JsonSerializerExample.java

输出

Serialization Annotations in Jackson