Json to Object , Jackson 으로 일급 컬렉션, 불변객체 생성

jackson 을 이용하여 json serialize/deserialize 시 일급 컬렉션과 불변객체를 사용해보자.

개인 기록용으로 작성.

{
"name" : "book1",
"isbn" : "isbn001001",
"authors" : [ "test1", "test2", "test3" ]
}

위와 같은 Json 문자열을 Jackson을 이용하여 Book, Autors, Author 클래스로 파싱하려한다.

  • Book class

Jackson@JsonCreator를 이용하면 인자가 없는 기본생성자set메소드 없이도 객체를 생성할 수 있으며, setter가 없는 불변객체를 생성할 수 있다.

@JsonCreator 는 mode 속성을 갖는데, default 로 Mode는 DEFAULT 이다.
DEFAULT로 사용하여도 문제는 없다.
인자가 하나인경우 DELEGATING 을 사용하고
인자가 여려개인 경우 @JsonProperty를 명시하여 PROPERTIES 를 사용하자.
  • Authors class

Authors 클래스는 하나의 컬렉션 변수만을 가지는 일급 컬렉션이다.
Book 클래스와 마찬가지로 @JsonCreator로 생성자를 지정한다.
(인자가 하나이기 때문에 @JsonProperty를 명시하지 않아도 된다.)
또한, 컬렉션타입 멤버 변수 authors@JsonValue를 지정한다.

@JsonValue는 인스턴스 전체에 대해 
serialize 시 사용되는 메소드, 필드 를 지정 할 수 있다.
Authors 객체를 jackson을 통해 직렬화 하면,
멤버변수 List<Author> authors를 직렬화하여 표현된다.
  • Author class

Author 는 String name을 감싼 객체이다.
Authors와 동일하며 멤버 변수 String name을 @JsonValue로 한다.

BigDecimal price; 
보다는
Money price;
와 같이 Money타입을 생성하면 타입만으로도 데이터의 유형을 인지 할 수 있다.
class Money { BigDecimal value;}

위와 같이 Jackson을 이용하여,
Object to Json , Json to Object 변환 하여 출력해보자.

아 콘솔 스샷이 너무 길다…

Lombok 의 XXArgsConstuctor를 사용하게 될경우
Lombok에 의해 생성된 생성자에 @JsonCreator 와 각 필드의 @JsonProperty가 제외된다.

이러한 경우 아래와 같이 onConstructor 어노테이션 속성을 추가하면
생성자에 @JsonCreator 가 붙게된다.
jdk 8 이상일때는 @AllArgsConstructor(onConstructor_={@JsonCreator})

생성자 변수에 필드변수로부터 @JsonProperty를 복사하여 붙여주려면
proejct root에 lombok.config파일을 생성하고 아래와 같이 붙여주면된다.

lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty만약 위의 config가 ide 에서 동작하지 않는다면.
java -jar lombok.jar config -g --verbose > lombok.config
를 통해 copyableAnnotations 존재여부를 확인해보고
없다면, 최근 release 된 lombok.jar를 설치하고 확인해보자.

무언가 더 좋은 방법이 있을듯도 하다..

찾으면… 해당 글은 업데이트 하거나 삭제예정!

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store