在 JSON 序列化中包含 null 值
一、簡介
當我們使用 Java 物件並需要將它們轉換為 JSON 格式時,正確處理null
值至關重要。從 JSON 輸出中省略null
值可能不符合我們的資料要求,尤其是當資料完整性至關重要時。
在本教程中,我們將深入研究在 Java 中的 JSON 序列化過程中包含null
值的有效方法。
2.用例場景:客戶管理系統
假設我們正在開發一個客戶管理系統,其中每個客戶都是具有姓名、電子郵件和年齡等屬性的 Java 物件。此外,有些客戶可能缺少電子郵件地址。
將客戶資料序列化為 JSON 進行儲存或傳輸時,包含缺少電子郵件地址的null
值對於保持資料一致性至關重要。
為了完整起見,讓我們定義範例中使用的Customer
類別:
public class Customer {
@JsonProperty
private final String name;
@JsonProperty
private final String address;
@JsonProperty
private final int age;
public Customer(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
// ...
}
在這裡,我們定義了Customer
類,其中包含name
、 address
和age
字段,並透過建構函數方法初始化。 toString()
方法也以類似 JSON 的格式提供物件的字串表示形式,以便於偵錯。
請注意,包含@JsonProperty
註解可確保所有相關欄位準確序列化到 JSON 輸出中,包括適用的null
值。
3. 使用傑克遜庫
Jackson 是一個著名的 JSON 處理 Java 函式庫,預設通常會從 JSON 輸出排除null
值。但是,我們可以利用 Jackson 的註解來明確包含null
值:
String expectedJson = "{\"name\":\"John\",\"address\":null,\"age\":25}";
Customer obj = new Customer("John", null, 25);
@Test
public void givenObjectWithNullField_whenJacksonUsed_thenIncludesNullValue() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
String json = mapper.writeValueAsString(obj);
assertEquals(expectedJson, json);
}
在此方法中,我們首先建立expectedJson
字串。隨後,我們用值John
、 null
和25
實例化一個Customer
物件。
接下來,我們透過使用參數JsonInclude.Include.ALWAYS
呼叫setSerializationInclusion()
方法,將ObjectMapper
實例配置為在序列化期間始終包含null
值。**這種細緻的設定可確保即使位址為null
,它也能在結果 JSON 輸出中準確表示。**
最後,我們使用assertEquals()
方法來驗證json
字串是否與expectedJson
相符。
4.使用Gson庫
Gson 是一個替代 Java 函式庫,可用於 JSON 序列化和反序列化。它提供了類似的選項來明確包含null
值。讓我們來看一個例子:
@Test
public void givenObjectWithNullField_whenGsonUsed_thenIncludesNullValue() {
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(obj);
assertEquals(expectedJson, json);
}
在這裡,我們使用GsonBuilder
使用serializeNulls()
方法來設定一個Gson
實例。此配置可確保在序列化期間合併null
值,從而確保結果 JSON 輸出中的精確表示,即使位址欄位為null
也是如此。
5. 結論
總之,在使用 Java 物件並將其轉換為 JSON 格式時,正確處理null
值至關重要。
在本教程中,我們學習如何在 JSON 序列化期間執行此操作。
與往常一樣,範例的原始程式碼可在 GitHub 上取得。