在 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 上取得。