Jackson Annotation 정리 (3) (Property Inclusion Annotation)
Jackson에서 사용하는 Annotation에 대해 정리한다. Baeldung (Jackson Annotation Example)에 정리된 글을 참고하였다.
3. Jackson Property Inclusion Annotations
3.1 @JsonIgnoreProperties
클래스 레벨 애노테이션으로, Jackson이 무시할 property 리스트를 지정할 수 있다. ignoreUnkown=true 속성은 JSON 입력 값에 대하여 Mapping 시 클래스에 선언되지 않은 property를 무시한다.
UnrecognizedPropertyException 예외 발생을 막을 수 있다
@JsonIgnoreProperties({ "id" })
public class BeanWithIgnore {
public int id;
public String name;
}
/** @JsonIgnoreProperties 적용 전 */
{
"id" : 1,
"name" : "My Bean"
}
/** @JsonIgnoreProperties 적용 후 */
{
"name" : "My Bean"
}
3.2 @JsonIgnore
필드 레벨에 적용되어 해당 필드를 Jackson이 무시할 수 있도록 한다. @JsonIgnoreProperties가 클래스 레벨에서 무시할 필드들을 지정해준다면, @JsonIgnore는 필드 하나하나에 붙여 무시하도록 지정하는 방식이다.
public class BeanWithIgnore {
@JsonIgnore
public int id;
public String name;
}
/** @JsonIgnore 적용 전 */
{
"id" : 1,
"name" : "My Bean"
}
/** @JsonIgnore 적용 후 */
{
"name" : "My Bean"
}
3.3 @JsonIgnoreType
선언된 애노테이션 하위 모든 Properties를 무시하도록 한다. 아래의 예시는 정적 멤버 클래스의 필드를 모두 무시한다.
public class User {
public int id;
public Name name;
@JsonIgnoreType
public static class Name {
public String firstName;
public String lastName;
}
}
@Test
public void testJsonIgnoreType() throws JsonProcessingException {
User.Name name = new User.Name("Changwoo", "Son");
User user = new User(1, name);
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter()
.writeValueAsString(user));
}
/** @JsonIgnoreType 적용 전 */
{
"id" : 1,
"name" : {
"firstName" : "Changwoo",
"lastName" : "Son"
}
}
/** @JsonIgnoreType 적용 후 */
{
"id" : 1
}
3.4 @JsonInclude
@JsonInclude는 특정 조건에 해당하는 property를 제외하고 se/deserialize 할 수 있도록 도와준다. 아래의 예시는 NON_NULL 조건으로 null인 property는 대상에서 제외하게 된다.
@JsonInclude(Include.NON_NULL)
public class MyBean {
public int id;
public String name;
}
@Test
public void testJsonInclude() throws JsonProcessingException {
MyBean myBean = new MyBean(1, null);
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(myBean));
}
/** @JsonInclude 적용 전 */
{
"id" : 1,
"name" : null
}
/** @JsonInclude 적용 후 */
{
"id" : 1
}
3.5 @JsonAutoDetect
@JsonAutoDetect 애노테이션은 Mapping 규칙을 유연하게 바꿀 수 있도록 도와준다. 멤버 변수뿐만 아니라 getter, setter의 Mapping 규칙 또한 지정할 수 있다. 아래의 예시는 fieldVisibility = Visibility.ANY를 통해 필드에 대한 Mapping 규칙을 private부터 public까지로 지정한다. 이 애노테이션을 통해 private 변수에 대해 serialize와 deserialize 과정에서 일어나는 데이터 접근 에러를 막을 수 있다.
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class PrivateBean {
private int id;
private String name;
}
@Test
public void testJsonInclude() throws JsonProcessingException {
MyBean myBean = new MyBean(1, null);
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(myBean));
}
@Test
public void testJsonAutoDetect() throws IOException {
String json = "{\"id\":1, \"name\":\"changwoo\"}";
// deserialization
PrivateBean privateBean = new ObjectMapper()
.readerFor(PrivateBean.class)
.readValue(json);
// Serialization
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(privateBean));
}