예를 들어보자
{
“no”: 1234,
“id”: “test”,
“name”: “John”,
“age”: 20
}
|
@Data
public class Member {
private int no;
private String id;
private String name;
//private int age;
}
|
위 처럼 되어 있는 경우 Member 객체로 변환할 때 오류가 발생할 것이다. age 라는 속성을 알 수 없기 때문이다.
이를 해결하는 방법은 2가지가 있다.(아마 그 외에도 있으리라 생각되지만 잘 모르겠다.)
1. POJO 클래스에 @JsonIgnoreProperty(ignoreUnknown = true) 를 붙여주는 방법
@JsonIgnoreProperty(ignoreUnknown = true)
@Data
public class Member {
private int no;
private String id;
private String name;
//private int age;
}
|
2. Jackson을 사용할 때, ObjectMapper에 Feature 설정을 하는 방법
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
|
FAIL_ON_UNKNOWN_PROPERTIES(기본값 true)을 false로 설정하면 된다.
이 방법은 JSON 포멧을 강제하지 않기 때문에 적절히 잘 사용해야 할 것 같다. 예를 들어 API 같은데서 정해진 포멧만 받아야 하는 경우는 꼭 true로 설정해야 할 수도 있을 것이다. 적절히 사용하자.
Spring에서 JSON 문자를 객체로 변환할 때, Jackson을 이용한다.
(HttpMessageConverter는 “Spring에서 Json을 파라메터로 넘겼을 때 어떻게 객체로 받을 수 있을까?” 글에서 확인하자.)
아래처럼 MessageConverter를 등록할 수 있다.
@Bean
public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setPrettyPrint(true);
converter.setObjectMapper(new CustomObjectMapper());
return converter;
}
|
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
this.configure(SerializationFeature.INDENT_OUTPUT, false);
this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
}
}
|
이렇게 등록해 두면 JSON을 객체로 변경시 UnknownProperty에 대해서는 무시하고 처리됩니다.
이 외에도 많은 옵션들이 있으니, SerializationFeature, DeserializationFeature Enum을 확인하면 확인할 수 있다. 친절히 주석이 작성되어 있으니 참고하면 좋을 듯 하다.
참고
'Programing > Java' 카테고리의 다른 글
Java에서 String과 new String()의 차이는? (2) | 2017.08.24 |
---|---|
Jackson을 이용한 org.joda.time.DateTime 파싱하기 (0) | 2017.07.27 |
상속 구조의 모델 객체에서 Lombok의 @Builder, @Delegate 사용기 (0) | 2017.04.21 |
Lombok @Builder 사용시 기본값 지정하기 (0) | 2017.04.12 |
HashMap, Hashtable, ConcurrentHashMap 동기화 처리 방식 (0) | 2016.12.20 |