[Jackson] JsonInclude 속성에 대해 알아보자.

2018. 5. 23. 21:50· Java
목차
  1. 1. ALWAYS (기본값)
  2. 2. NON_NULL
  3. 3. NON_ABSENT
  4. 4. NON_EMPTY
  5. 5. NON_DEFAULT
  6. 6. 그 외

Json 형식으로 데이터를 주고받을 때 Jackson의 ObjectMapper를 자주 이용한다.

그런데 기본값으로 Serialize 하게 되면 null, "" 같은 (상황에 따라) 필요 없는 값 또한 모두 변환시켜준다.

이를 아래의 메소드를 통하여 Serialize할 때 원하는 값만을 포함시킬 수 있다.

objectMapper.setSerializationInclusion();

아래 주석처럼 어노테이션으로도 이용할 수 있다. 객체마다 Include 방식이 다르면 어노테이션을 활용하자.

그럼, 다양한 데이터를 가진 객체로 테스트를 해보자. jackson-databind 2.9.5를 기준으로 테스트가 진행되었다.

@Getter
//@JsonInclude(JsonInclude.Include.ALWAYS)
public static class Value {
    private String string;
    private String emptyString;
    private Object nullValue;
    private int number;
    private int zero;
    private List<String> list;
    private List<String> emptyList;
    private Date date;
    private Date zeroDate;
    private Optional<String> optional;
    private Optional<String> emptyOptional;


    public Value() {
        this.string = "민수";
        this.emptyString = "";
        this.nullValue = null;
        this.number = 100;
        this.zero = 0;
        this.list = asList("민수", "원우");
        this.emptyList = emptyList();
        date = new Date();
        zeroDate = new Date(0L);
        this.optional = Optional.of("민수");
        this.emptyOptional = Optional.empty();
    }
}

 

1. ALWAYS (기본값)

@Test
public void always() throws JsonProcessingException {
    this.objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
    String result = this.objectMapper.writeValueAsString(new Value());

    System.out.println(result);
}
  • 모든 값을 출력한다.
{
  "string": "민수",
  "emptyString": "",
  "nullValue": null,
  "number": 100,
  "zero": 0,
  "list": [
    "민수",
    "원우"
  ],
  "emptyList": [],
  "date": 1527077763796,
  "zeroDate": 0,
  "optional": {
    "present": true
  },
  "emptyOptional": {
    "present": false
  }
}

2. NON_NULL

@Test
public void non_null() throws JsonProcessingException {
    this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    String result = this.objectMapper.writeValueAsString(new Value());

    System.out.println(result);
}
  • null은 제외한다.
{
  "string": "민수",
  "emptyString": "",
  "number": 100,
  "zero": 0,
  "list": [
    "민수",
    "원우"
  ],
  "emptyList": [
  ],
  "date": 1527077763837,
  "zeroDate": 0,
  "optional": {
    "present": true
  },
  "emptyOptional": {
    "present": false
  }
}

3. NON_ABSENT

@Test
public void non_absent() throws JsonProcessingException {
    this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
    String result = this.objectMapper.writeValueAsString(new Value());

    System.out.println(result);
}
  • null은 제외한다.
  • 참조 유형 (Java 8 'Optional'또는 {link java.utl.concurrent.atomic.AtomicReference})의 "absent"값; 즉, null이 아닌 값은 제외한다. (이해가 잘 안 가요...)
{
  "string": "민수",
  "emptyString": "",
  "number": 100,
  "zero": 0,
  "list": [
    "민수",
    "원우"
  ],
  "emptyList": [
  ],
  "date": 1527077763833,
  "zeroDate": 0,
  "optional": {
    "present": true
  },
  "emptyOptional": {
    "present": false
  }
}

4. NON_EMPTY

@Test
public void non_empty() throws JsonProcessingException {
    this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    String result = this.objectMapper.writeValueAsString(new Value());

    System.out.println(result);
}
  • null은 제외한다.
  • absent는 제외한다. ( 3. NON_ABSENT 참고 )
  • Collection, Map의 isEmpty()가 true 이면 제외한다.
  • Array의 length가 0이면 제외한다.
  • String의 length()가 0이면 제외한다.
{
  "string": "민수",
  "number": 100,
  "zero": 0,
  "list": [
    "민수",
    "원우"
  ],
  "date": 1527077763822,
  "zeroDate": 0,
  "optional": {
    "present": true
  },
  "emptyOptional": {
    "present": false
  }
}

5. NON_DEFAULT

@Test
public void non_default() throws JsonProcessingException {
    this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
    String result = this.objectMapper.writeValueAsString(new Value());

    System.out.println(result);
}
  • empty는 제외된다. ( 4. NON_EMPTY 참고 )
  • primitive 타입이 디폴트 값이면 제외한다. (int / Integer : 0 , boolean / Boolean : false 등)
  • Date의 timestamp가 0L이면 제외한다.
{
  "string": "민수",
  "number": 100,
  "list": [
    "민수",
    "원우"
  ],
  "date": 1527077763725,
  "optional": {
    "present": true
  },
  "emptyOptional": {
  }
}

6. 그 외

CUSTOM, USE_DEFAULTS는 잘 모르겠다...

사용자에 맞게 Custom 할 때 쓰이는 것 같다.

 

전체 코드는 github에 저장되어 있다. 필요하면 참고하도록 하자.

저작자표시 비영리 변경금지 (새창열림)

'Java' 카테고리의 다른 글

BigDecimal의 toString(), toPlainString(), toEngineeringString()  (0) 2018.09.11
Java의 ScheduledExecutorService를 이용해서 스케줄러를 만들어보자  (1) 2018.05.23
Java로 날씨 알림 서비스를 만들어보자 (OOP, Clean Code)  (1) 2018.05.21
Java의 List를 상황에 맞게 생성해보자 ( asList(), emptyList(), singletonList() )  (2) 2018.05.15
Intellij로 자바 프로젝트 만들기 + 라이브러리 추가하기  (0) 2018.01.21
  1. 1. ALWAYS (기본값)
  2. 2. NON_NULL
  3. 3. NON_ABSENT
  4. 4. NON_EMPTY
  5. 5. NON_DEFAULT
  6. 6. 그 외
'Java' 카테고리의 다른 글
  • BigDecimal의 toString(), toPlainString(), toEngineeringString()
  • Java의 ScheduledExecutorService를 이용해서 스케줄러를 만들어보자
  • Java로 날씨 알림 서비스를 만들어보자 (OOP, Clean Code)
  • Java의 List를 상황에 맞게 생성해보자 ( asList(), emptyList(), singletonList() )
AlwaysPr
AlwaysPr
AlwaysPr
민수's 기술 블로그
AlwaysPr
전체
오늘
어제
  • All (38)
    • Programming (8)
    • Java (10)
    • Spring (13)
    • JavaScript (1)
    • Book (1)
    • Seminar (1)
    • Diary (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • structured-concurrency
  • 가상스레드
  • stringtemplates
  • record pattern
  • DefaultBatchConfiguration
  • Reactor
  • Spring batch5
  • aop
  • @EnableBatchProcessing
  • virtual thread
  • loom project
  • 자바21
  • java17
  • nonblocking
  • @Cachable
  • 고졸개발자
  • 스프링배치5
  • eventdriven
  • FFM
  • Spring
  • 웹플럭스
  • scopedValue
  • lombok.config
  • 개발자
  • JobBuilder
  • r2dbc
  • StepBuilder
  • 레코드매칭
  • Webflux
  • Java21

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
AlwaysPr
[Jackson] JsonInclude 속성에 대해 알아보자.
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.