公開日:7/16/2022  更新日:7/16/2022

  • twitter
  • facebook
  • line

JsonInclude.Include.NON_NULL でnullとOptinal.empty() のフィールドが削除されるか検証

はじめに

マスタ更新用のAPI開発で、リクエストパラメータにセットする更新用Beanに @JsonInclude(JsonInclude.Include.NON_NULL) アノテーションを付与していた。
その際に、nullメンバだとJSONに表示されなくなるが、Optinal型の変数にOptinal.empty()を設定した場合、同様に表示されなくなるのか気になった。

検証結果

Optional型のフィールドに Optinal.empty() を設定した場合、JSONから削除されず、null値が設定される。

検証コード

検証を実施するために、以下の外部JARを公式サイトからダウンロードして参照ライブラリに設定した。

lombok.jar
jackson-annotations-2.12.7.jar
jackson-core-2.13.3.jar
jackson-databind-2.13.3.jar

dtoクラス

import java.util.Optional;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SampleDto {
    private String name;
    private Integer age;
    private Optional <String> memo;
}

mainクラス

① Optional型のフィールドに値を設定するパターン

import java.util.Optional;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;

public class Main {

	public static void main(String[] args) throws JsonProcessingException{

	    SampleDto dto = new SampleDto("hoge",25,Optional.of("メモ"));
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        String json = mapper.writeValueAsString(dto);
        System.out.println(json);

        //JSON出力結果
        //{"name":"hoge","age":25,"memo":"メモ"}
	}
}

② Optional型のフィールドにnullを設定するパターン

	    SampleDto dto = new SampleDto("hoge",25,null);
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        String json = mapper.writeValueAsString(dto);
        System.out.println(json);

        //JSON出力結果
        //{"name":"hoge","age":25}

③ Optional型のフィールドにOptional.empty()を設定するパターン

	    SampleDto dto = new SampleDto("hoge",25,Optional.empty());
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        String json = mapper.writeValueAsString(dto);
        System.out.println(json);

        //JSON出力結果
        //{"name":"hoge","age":25,"memo":null}

戻る