본문 바로가기
Programing/Java

Jackson을 이용하여 JSON -> POJO 변환시 POJO에 존재하지 않는 property가 있는 경우

by Tomining 2017. 7. 21.
예를 들어보자
{
    “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을 이용한다.
아래처럼 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을 확인하면 확인할 수 있다. 친절히 주석이 작성되어 있으니 참고하면 좋을 듯 하다.

참고