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

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는 잘 모르겠다...

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

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

 

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

 

[출처] https://alwayspr.tistory.com/31

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
161 [Java 자료구조] JPA와 Spring Data JPA의 차이 file 졸리운_곰 2022.09.09 30
160 [java 자료구조] 하이버네이트 쉽게 입문하기 (기초)-환경설정,입력조회 개발 file 졸리운_곰 2022.09.09 22
159 [Java 자료구조] JPA, Hibernate, 그리고 Spring Data JPA의 차이점 졸리운_곰 2022.09.09 23
158 [Java][MyBatisc] myBatis에서 null과 nullString을 체크할 때 졸리운_곰 2021.09.13 33
157 [MongoDB/Java] MongoDB에 JSON 형식 데이터 삽입하기 file 졸리운_곰 2021.07.13 27
156 [Java, MongoDB] mongodb java driver 3.0: how to store JSON document 졸리운_곰 2021.07.13 30
155 [Java 자료구조] [Java] 문자열의 첫 글자 제거 졸리운_곰 2021.05.24 406
154 [Java 자료구조] [java] 특정 문자열 사이의 문자열 추출하기, 정규식 졸리운_곰 2021.05.24 1875
153 [Java 자료구조] [JAVA] Java언어로 JSON 생성, 파싱 예제 file 졸리운_곰 2021.05.17 19
152 [Java 자료구조] [Java] Immutable Class (불변 클래스) file 졸리운_곰 2021.03.07 26
151 [Java 자료구조] 불변 객체란? Java Immutable Object file 졸리운_곰 2021.03.07 48
150 [Java 자료구조] [Java] Immutable Object(불변객체) 졸리운_곰 2021.03.07 44
149 [java 자료구조] Oracle + Mybatis 환경에서의 Date 다루기 졸리운_곰 2021.02.25 57
148 Java JSON library Jackson Date Date Json 시리얼라이즈/디씨리얼라이즈 file 졸리운_곰 2021.02.25 28
147 [Java, JSON, jackson] Ignoring new fields on JSON objects using Jackson 졸리운_곰 2021.02.19 16
» [Java] [Jackson] JsonInclude 속성에 대해 알아보자. 졸리운_곰 2021.02.03 592
145 [java] [jackson] Map - JSON간 변환 졸리운_곰 2021.02.02 41
144 [java] [자료구조] Remove null values from json using jackson 졸리운_곰 2021.02.02 78
143 자바 인코딩 관련 문제 종합 정리 file 졸리운_곰 2021.01.29 40
142 [Java 디자인패턴] [JAVA 디자인 패턴] static을 응용한 싱글톤 패턴(Singleton Pattern) 구현 졸리운_곰 2021.01.22 20
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED