Jackson Annotation

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

Jackson Annotation 사용법 정리글

1. Jackson Serialization Annotation

  • 쉽게 말해 객체를 Json으로 변경하는것을 직렬화 라고 한다.

1.1 @JsonAnyGetter

  • Map Type 속성을 일반 Type 속성으로 유연하게 쓰일때 사용된다.
  • @JsonUnwrapped 과 비슷한데 차이점은 객체랑 Map타입 차이라 생각하면된다.
  • 메서드에만 적용 가능
public class ExtendableBean {
    public String name;
    private Map<String, String> properties;

    @JsonAnyGetter
    public Map<String, String> getProperties() {
        return properties;
    }
}
// 적용 전
{
    "name":"chan",
    "properties" : {
      "attr2":"val2",
      "attr1":"val1"
    }
}
// 적용 후
{
    "name":"chan",
    "attr2":"val2",
    "attr1":"val1"
}

1.2 @JsonGetter

  • getter를 지정할 때 쓰이며 @JsonProperty의 getter메서드 대안으로 쓰인다.
  • 메서드에만 적용 가능
public class MyBean {
    public int id;
    private String name;

    @JsonGetter("name")
    public String getTheName() {
        return name;
    }
}
// 적용 전
{
    "id":1,
    "theName":"chan"
}
// 적용 후
{
    "id":1,
    "name":"chan"
}

1.3 @JsonPropertyOrder

  • 속성을 직렬화시 순서를 변경할 때 사용된다.
  • 기본적으로 변수 선언 순서대로 출력하지만 이 어노테이션으로 조절 가능
  • 클래스, 메서드, 멤버변수, 생성자에 적용 가능
@JsonPropertyOrder({ "name", "age", "id" })
public class MyBean {
    public int id;
    public String name;
    public int age;
}
// 적용 전
{
    "id":1,
    "name":"chan",
    "age": 29
}
// 적용 후
{
    "name":"chan",
    "age": 29,
    "id":1
}
  • @JsonPropertyOrder(alphabetic=true) alphabetic를 true로 할경우 알파벳 순서로 직렬화할 수 있다.
// alphabetic=true 로 할경우
{
    "age": 29,
    "id":1,
    "name":"chan"
}

1.4 @JsonRawValue

  • 속성값을 그대로 직렬화 할때 사용된다.
  • 메서드, 멤버변수에 적용 가능
public class RawBean {
    public String name;

    @JsonRawValue
    public String json;
}
// 사용전
{
    "name":"chan",
    "json":"{\"attr\":false}"
}
// 사용 후
{
    "name":"chan",
    "json":{
        "attr":false
    }
}

1.5 @JsonValue

  • 객체를 직렬화가 아닌 직렬화 하는 메서드를 호출할때 사용됩니다.
  • 메서드에 사용 가능 (2.9 부터 필드에서 사용가능)
public class PersonValue {

    public long id = 0;
    public String name = "chan";

    @JsonValue
    public String toJson(){
        return this.id + "," + this.name;
    }
}
// 사용전
{
    "id": 1,
    "name": "chan"
}
// 사용 후
{
    "1,chan"
}

1.6 @JsonRootName

  • 특정 name으로 감쌀때 사용 된다.
  • 클래스에만 사용가능
@JsonRootName(value = "user")
public class UserWithRoot {
    public int id;
    public String name;
}
// 사용전
{
    "id": 1,
    "name": "chan"
}

// 사용 후
{
    "user": {
        "id": 1,
        "name": "chan"
    }
}

1.7 @JsonSerialize

  • 커스텀하게 직렬화 할때 사용된다.
  • 클래스, 메서드, 필드, 매개변수에 사용가능
public class EventWithSerializer {
    public String name;

    @JsonSerialize(using = CustomDateSerializer.class)
    public Date eventDate;
}

public class CustomDateSerializer extends StdSerializer<Date> {

    private static SimpleDateFormat formatter
      = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public CustomDateSerializer() {
        this(null);
    }

    public CustomDateSerializer(Class<Date> t) {
        super(t);
    }

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) throws IOException, JsonProcessingException {
        gen.writeString(formatter.format(value));
    }
}
// 사용전
{
    "name":"chan",
    "eventDate":1576317600000
}
// 사용후
{
    "name":"chan",
    "eventDate":"2019-12-14 19:00:00"
}
참고 + 출처
chanhee.kim's profile image

chanhee.kim

2019-12-14 19:11

Read more posts by this author