Jackson – 自定義序列化器

Data,Jackson
Remote
1
01:06 AM · Dec 01 ,2025

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

現在,讓我們通過僅序列化 Userid,而不是整個 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 輸出。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.