Jackson – 自定义序列化器
最后更新:2024年5月11日
1. 概述
本快速教程将展示如何使用 自定义序列化器 使用 Jackson 2 序列化 Java 实体。
如果您想深入了解并学习 Jackson 2 的其他酷炫功能 – 请前往 主要的 Jackson 教程。
2. 对象图的标准序列化
让我们定义 2 个简单的实体,看看 Jackson 在没有任何自定义逻辑的情况下如何序列化这些实体
public class User {
public int id;
public String name;
}
public class Item {
public int id;
public String itemName;
public User owner;
}
现在,让我们序列化一个带有 User 实体的 Item 实体
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
这将为这两个实体生成完整的 JSON 表示形式
{
"id": 1,
"itemName": "theItem",
"owner": {
"id": 2,
"name": "theUser"
}
}
3. 在 ObjectMapper 上使用自定义序列化器
现在,让我们简化上面的 JSON 输出,只序列化 User 的 id,而不序列化整个 User 对象;我们希望得到以下更简单的 JSON
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
简而言之,我们需要为 Item 对象定义一个自定义序列化器
public class ItemSerializer extends StdSerializer<Item> {
public ItemSerializer() {
this(null);
}
public ItemSerializer(Class<Item> t) {
super(t);
}
@Override
public void serialize(
Item value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeStringField("itemName", value.itemName);
jgen.writeNumberField("owner", value.owner.id);
jgen.writeEndObject();
}
}
现在,我们需要将此自定义序列化器与 ObjectMapper 针对 Item 类注册,并执行序列化
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Item.class, new ItemSerializer());
mapper.registerModule(module);
String serialized = mapper.writeValueAsString(myItem);
就这样 – 我们现在有了 Item->User 实体的更简单、自定义的 JSON 序列化。
4. 在类上使用自定义序列化器
我们也可以直接在类上注册序列化器,而不是在 ObjectMapper 上
@JsonSerialize(using = ItemSerializer.class)
public class Item {
...
}
现在,当执行标准序列化时
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
我们将获得由通过 @JsonSerialize 指定的序列化器创建的自定义 JSON 输出
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
当无法直接访问和配置 ObjectMapper 时,这会很有帮助。
5. 结论
本文说明了如何通过使用序列化器,使用 Jackson 2 获取自定义 JSON 输出。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















