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;
}
現在,讓我們使用 Item 實體和 User 實體進行序列化:
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
現在,讓我們通過僅序列化 User 的 id,而不是整個 User 對象,簡化上述 JSON 輸出;我們希望得到以下更簡單的 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 中的 Serializers 獲得自定義 JSON 輸出。