- 전체
- JAVA 일반
- JAVA 수학
- JAVA 그래픽
- JAVA 자료구조
- JAVA 인공지능
- JAVA 인터넷
- Java Framework
- Java GUI (AWT,SWING,SWT,JFACE)
- SWT and RCP (web RAP/RWT)[eclipse], EMF
JAVA 자료구조 [Java] [Jackson] JsonInclude 속성에 대해 알아보자.
2021.02.03 17:28
[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는 잘 모르겠다...
사용자에 맞게 Custom 할 때 쓰이는 것 같다.
전체 코드는 github에 저장되어 있다. 필요하면 참고하도록 하자.
[출처] https://alwayspr.tistory.com/31
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.