將默認值設為空字段(Jackson 映射)

Jackson
Remote
1
08:21 PM · Nov 30 ,2025

1. 概述

由於其相對的簡單性和健壯性,JSON(JavaScript Object Notation)已成為人類可讀性和機器解析都非常理想的數據格式。儘管如此,某些JSON對象和屬性仍然可能存在一些問題,需要進行特殊處理。

在本教程中,null或缺失值的方法。我們將會探索三種不同的方法,具有不同的控制級別。

2. 在類級別設置默認值

首先,我們來演示如何通過POJO獲取完全缺失的默認值,當傳入的JSON String 中沒有字段時。

例如,我們創建一個包含兩個字段的對象,一個 必需的,另一個 可選的,都使用各自的名稱:

class NonAnnotatedDefaultValue {
    String required;
    String optional = "defaultValue";
    // 標準的 getter 和 setter
}

因此,我們只為名為 optional 的字段分配了一個值。由於這樣,Jackson 會使用預定義的 String 如果字段在傳入的JSON對象中丟失時。

為了演示,讓我們使用新的對象,讓Jackson將一個沒有名為 optional 的字段的JSON String 映射到它。為此,使用 ObjectMapper 對象及其 readValue() 方法:

@Test
void givenAClassWithADefaultValue_whenReadingJsonWithoutOptionalValue_thenExpectDefaultValueInResult()
  throws JsonProcessingException {
    String noOptionalField = "{\"required\": \"value\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    NonAnnotatedDefaultValue createdObject = objectMapper.readValue(noOptionalField, NonAnnotatedDefaultValue.class);
    assert(createdObject.getRequired()).equals("value");
    assert(createdObject.getOptional()).equals("defaultValue");
}

我們可以從斷言中看到,結果對象同時包含來自JSON的值和我們之前指定的默認值

這種方法的缺點是,它僅在屬性完全從傳入的JSON中丟失時才有效。如果屬性的值為 null,則Jackson 不會應用默認值。

在後續部分中,我們將探討如何高效地處理 null

3. 實現設置方法以獲得完全控制

當然,通過為可選字段實現設置方法,我們可以完全控制映射過程,以便為我們想要提供值的字段提供值。

因此,讓我們創建一個包含所需設置方法的對象,Jackson 在創建對象時使用該設置方法:

class SetterDefaultValue {
   String required;
   String optional = "valueIfMissingEntirely";

    public void setOptional(String optional) {
        if (optional == null) {
            this.optional = "valueIfNull";
        }
    }
   // 標準的 getter 和 setter
}

因此,我們為類級別提供了默認值。但是,我們還提供了設置方法。在該設置方法中,我們可以執行任何所需的檢查。在本例中,我們明確提供瞭如果值為 null 的預期行為。 Jackson 現在將 optional 設置為 valueIfMissingEntirely 如果我們不包括該屬性在 JSON 中,或者如果它設置為 null,則將 valueIfNull 設置為 optional

我們也可以使兩個值相同,如果滿足要求:

@Test
void givenAClassWithASetter_whenReadingJsonWithNullOptionalValue_thenExpectDefaultValueInResult()
  throws JsonProcessingException {
    String nullOptionalField = "{\"required\": \"value\", \"optional\": null}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonSetterDefaultValue createdObject = objectMapper.readValue(nullOptionalField, JsonSetterDefaultValue.class);
    assert(createdObject.getRequired()).equals("value");
    assert(createdObject.getOptional()).equals("valueIfNull");
}

這裏,我們提供了一個 JSON 字符串,該字符串包含名為 optional 的字段設置為 null。因此,我們可以從斷言中看到,在 Jackson 創建的相應對象中,該字段已設置為 valueIfNull,這要歸功於設置方法註解

這使得通用設置方法非常靈活。例如,我們也可以檢查空 String 並以相同的方式應用默認值,如果需要或要求。

此外,設置方法可以更復雜。

4. 將空字符串反序列化為空字符串

在之前的 방법에 추가하여, 我們可以使用 setter 方法來將 null 值反序列化到 optional 字段中

讓我們再次創建一個 POJO 類,其中包含 setter 方法用於 optional 字段,以便 Jackson 根據需要創建對象:

class SetterDefaultValueAsEmptyString {
    String required;
    String optional = "valueIfMissingEntirely";

    public void setOptional(String optional) {
        if (optional == null) {
            this.optional = "";
        }
    }
    
    // 標準的 getter 和 setter
}

在 setter 方法中,我們明確定義了對 null 值的預期行為。Jackson 在我們不包含屬性時,將 optional 字段設置為 valueIfMissingEntirely,正如之前一樣。但是,現在它在包含該字段但將其設置為 null 時,也將其 optional 字段設置為一個空字符串。

讓我們使用一個測試方法來驗證 null 值是否映射到空字符串:

@Test
public void givenAClassWithASetter_whenReadingJsonWithNullOptionalValue_thenEmptyStringInResult() throws JsonProcessingException {
    String nullOptionalField = "{\"required\": \"value\", \"optional\": null}";
    ObjectMapper objectMapper = new ObjectMapper();
    SetterDefaultValueAsEmptyString createdObject = objectMapper.readValue(nullOptionalField, SetterDefaultValueAsEmptyString.class);
    assert(createdObject.getRequired()).equals("value");
    assert(createdObject.getOptional()).equals("");
}

這次,提供的 JSON 中的 optional 字段設置為 null。正如斷言中所示,由 Jackson 創建的,結果對象包含該字段,其值為空字符串

5. 使用 @JsonSetter 與 Nulls.SKIP

最後的選項利用了 JsonSetter 並擴展了其用法,使其忽略 null 值。

讓我們創建一個新的類:

class NullsSkipDefaultValue {
    private String required;
    @JsonSetter(nulls = Nulls.SKIP)
    private String optional = "defaultValue";
    // 標準的 getter 和 setter
}

Nulls.SKIP 參數告訴 JsonSetter 跳過任何包含 null 值的輸入。 Jackson 則使用提供的默認值。

@Test
void givenAClassWithAJsonSetterNullsSkip_whenReadingJsonWithNullOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException {
    String nullOptionalField = "{\"required\": \"value\", \"optional\": null}";
    ObjectMapper objectMapper = new ObjectMapper();
    NullsSkipDefaultValue createdObject = objectMapper.readValue(nullOptionalField, NullsSkipDefaultValue.class);
    assert(createdObject.getRequired()).equals("value");
    assert(createdObject.getOptional()).equals("defaultValue");
}

上面,我們可以看到,給定輸入 JSON,其中 optional 字段被賦值為 null,我們得到我們想要默認值。 此方法在不提供 optional 字段時也產生相同結果。

6. 結論

在本文中,我們探討了四種處理 JSON 中缺失或 null 值的方法,這些值我們將使用 Jackson 進行解析。

在類級別設置值在某些情況下很有用,但如果存在 null 值,則會失敗。相反,我們可以實現設置器方法以獲得最大控制權。因此,我們可以將 null 值設置為所需的值。另一方面,在設置器方法中,也可以將 null 值設置為空字符串。 此外,我們還可以使用 @JsonSetter 在字段聲明上簡單地忽略 null 值。

這四種方法都可能適用於不同的用例。最重要的考慮因素是如何讓應用程序處理具有 null 值的屬性。

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

發佈 評論

Some HTML is okay.