xml, 정확히 soap 결과에서 객체 매핑을 위한 코드를 기록합니다.
Jackson 은 SpringBoot 에 포함 된 버전입니다.2021년 6월
- SpringBoot 2.2.6
- Groovy 2.5
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 를 지정할 수도 있습니다.