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"
}
}
참고 + 출처
- Jackson tutorial 참고
- Yun Blog 참고