Jackson Annotation

  • Jackson은 json 라이브러리입니다.
  • json뿐만아니라 xml, yaml 등 다양한 형식의 데이터도 지원한다.
  • Spring API서버에서 거의 필수적으로 사용되기때문에 한번 정리해봤다.
  • Spring 3.2버전부터 jackson 라이브러리가 지원된다. (따로 dependency 안받아도 됨)

Jackson Annotation 사용법 정리글

3. Jackson Property Inclusion Annotation

3.1 @JsonIgnoreProperties

  • 제외할 속성이나 목록을 지정할 클래스레벨의 어노테이션이다.
@JsonIgnoreProperties({ "id", "age" })
public class BeanWithIgnore {
    public int id;
    public String name;
    public int age;
}
{
    "name":"chan"
}

3.2 @JsonIgnore

  • 제외할 속성을 필드레벨에서 사용되는 어노테이션이다.
public class BeanWithIgnore {
    @JsonIgnore
    public int id;

    public String name;

    @JsonIgnore
    public int age;
}
{
    "name":"chan"
}

3.3 @JsonIgnoreType

  • 어노테이션 달린 모든속성을 제외한다.
  • 클래스에만 사용가능
public class User {
    public int id;
    public Name name;

    @JsonIgnoreType
    public static class Name {
        public String firstName;
        public String lastName;
    }
}
{
    "id":1
}

3.4 @JsonInclude

  • empty/null/default 등의 속성을 제외 시킬때 사용된다.
  • NON_NULL, NON_EMPTY, NON_DEFAULT 등의 값이 있다.
  • 클래스, 메서드, 매개변수, 필드에 사용가능
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyBean {
    public int id; // 1
    public String name; // "chan"
    public int age; // null
    public String address; // null
}
{
    "id":1,
    "name":"chan"
}

3.5 @JsonAutoDetect

  • 볼 수 있는 속성과 볼 수 없는 속성을 재정의 할 수 있습니다.
  • fieldVisibility의 값으로는 getterVisibility, isGetterVisibility, setterVisibility, creatorVisibility, fieldVisibility이 있다
  • Visibility의 값으로는 ANY, NON_PRIVATE, PROTECTED_AND_PUBLIC, PUBLIC_ONLY, NONE, DEFAULT 가 있다.
  • 클래스에만 사용가능
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class PrivateBean {
    private int id;
    private String name;
}
{
    "id":1,
    "name":"chan"
}

4. Jackson Polymorphic Type Handling Annotation

  • 다형성 관련 어노테이션
  • @JsonTypeInfo – 직렬화에 포함 할 유형 정보를 자세히 나타냅니다.
  • @JsonSubTypes – 어노테이션의 하위 유형을 나타냅니다.
  • @JsonTypeName – 어노테이션이 있는 클래스에 사용할 논리 유형 이름을 정의합니다.
public class Zoo {
    public Animal animal;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "cat")
    })
    public static class Animal {
        public String name;
    }

    @JsonTypeName("dog")
    public static class Dog extends Animal {
        public double barkVolume;
    }

    @JsonTypeName("cat")
    public static class Cat extends Animal {
        boolean likesCream;
        public int lives;
    }
}

@Test
public void whenSerializingPolymorphic_thenCorrect() throws JsonProcessingException {
    Zoo.Dog dog = new Zoo.Dog("lacy");
    Zoo zoo = new Zoo(dog);

    String result = new ObjectMapper().writeValueAsString(zoo);

    assertThat(result, containsString("type"));
    assertThat(result, containsString("dog"));
}
// dog를 직렬화 할때
{
    "animal": {
        "type": "dog",
        "name": "lacy",
        "barkVolume": 0
    }
}
// cat을 직렬화 할때
{
    "animal":{
        "name":"lacy",
        "type":"cat"
    }
}
참고 + 출처
chanhee.kim's profile image

chanhee.kim

2019-12-15 17:53

Read more posts by this author