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