Jackson 라이브러리 Json to Object

nona·2021년 6월 17일
0

Groovy

목록 보기
1/1

xml, 정확히 soap 결과에서 객체 매핑을 위한 코드를 기록합니다.
Jackson 은 SpringBoot 에 포함 된 버전입니다.

2021년 6월

  • SpringBoot 2.2.6
  • Groovy 2.5

Pojo, DTO, VO 등등으로 명명된... 매핑 대상 Class

class Data {
  def a
  def b
  
  def getA() {
    return a
  }
  def setA(def a) {
    this.a = a
  }
  ...
}

매핑 코드

def json = ...

ObjectMapper objectMapper = new ObjectMapper()
// 객체에 정의되지 않은 필드가 있더라도 무시
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 배열이 아닌 객체라도 List 변수에 할당 가능
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
... 각종 설정 ... 빌더 패턴도 지원되는걸로 보임
Data data = objectMapper.readValue(json, Data.class);

그런데 json 필드명과 객체의 필드명이 다르다면?
(ex) { "b": "123" } 을 위의 객체 멤버변수 a 에 할당하고 싶다.

class Data {
  def a
  
  def getA() {
    return a
  }
  @JsonSetter('b') // 요 어노테이션을 지정합니다.
  def setA(def a) {
    this.a = a
  }
  ...
}

그런데 @JsonSetter 를 쓰고나서 객체가 다시 Json 으로 변환될때 a 가 없어지고 b 가 되네요?
{ "b": "123" } -> Data -> { "b": "123" }

class Data {
  def a
  
  @JsonGetter('a') // a 로 생성하기 위해 요 어노테이션을 써줍니다.
  def getA() {
    return a
  }
  @JsonSetter('b')
  def setA(def a) {
    this.a = a
  }
  ...
}

그럼 이런케이스에서 항상 getter/setter 에 다 어노테이션을 줘야할까요?
다른 방법이 있었습니다.

class Data {
  @JsonAlias('b') // 요 어노테이션 하나면 됩니다.
  def a
  
  def getA() {
    return a
  }
  def setA(def a) {
    this.a = a
  }
  ...
}

@JsonAlias 는 Jackson 2.9 부터 지원된다고 합니다.
한 멤버변수에 여러 Alias 를 지정할 수도 있습니다.

(참고) Jackson 2.9 에 추가된 @JsonAlias 애노테이션

profile
개발 놀이 중

0개의 댓글