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 |