본문 바로가기
Develop/Spring+JPA

[Spring] @JsonProperty

by 연로그 2021. 3. 8.
반응형

json을 자바 객체로 역직렬화 할때, json에 담긴 key이름과 변수명이 다른 문제로 @JsonProperty를 많이 사용하는 것 같다.

 

예를 들면, 아래와 같은 Blog 클래스가 있다고 하자.

public class Blog {
    private String userName;
    private String blogLink;

    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserName() {
        return userName;
    }
    public void setBlogLink(String blogLink) {
        this.blogLink = blogLink;
    }
    public String getBlogLink() {
        return blogLink;
    }
}

 

setter 메소드를 이용해 각각 이름과 링크에 '연로그', 'yeonyeon.tistory.com/'를 입력한 뒤, JSON화 시켰다고 가정하자.

그러면 결과는 다음과 같을 것이다.

{"userName":"연로그", "blogLink":"http://yeonyeon.tistory.com/"}

 

하지만 만약, 아래 같이 userName이 아닌 user_name으로, blogLink가 아닌 blog_link로 받고 싶다면?

{"user_name":"연로그", "blog_link":"http://yeonyeon.tistory.com/"}

 

이럴 때 @JsonProperty를 사용해주면 된다.

public class Blog {
    @JsonProperty("user_name")
    private String userName;
    
    @JsonProperty("blog_link")
    private String blogLink;
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserName() {
        return userName;
    }
    public void setBlogLink(String blogLink) {
        this.blogLink = blogLink;
    }
    public String getBlogLink() {
        return blogLink;
    }
}

 

결과 확인을 위한 테스트 코드

public static void main (String[] args) {
	ObjectMapper mapper = new ObjectMapper();
		
	Blog blog = new Blog();
	blog.setUserName("연로그");
	blog.setBlogLink("yeonyeon.tistory.com");
		
	try {
		System.out.println(mapper.writeValueAsString(blog));
	} catch (JsonProcessingException e) {
		e.printStackTrace();
	}
}

실행 결과

 

만약 @JsonProperty가 적용되지 않는 문제를 겪는다면, import를 잘 살펴봐야 한다.

import com.fasterxml.jackson.annotation.JsonProperty; // 원래 import 해야하는 것
import org.codehaus.jackson.annotate.JsonProperty;    // 내가 import 했던 것 (에러)

 

 

결론

  • @JsonProperty는 JSON 직렬화 시 설정할 수 있는 이름을 지정하는 어노테이션이다.

 

위 예시에서는 변수 선언 시 어노테이션을 적용했지만, 변수에만 적용할 수 있는 것은 아니다.

getter / setter 메소드에 어노테이션을 적용하기도 한다.

이 부분에 대해서는 아직 차이점을 찾지 못했다....

 


참고

개념 설명: pjh3749.tistory.com/281

에러 해결: www.python2.net/questions-104349.htm

반응형