2012-08-26 3 views
1

json 객체를 반환하는 나머지 서비스를 호출하고 있습니다. Jackson과 데이터 바인딩을 사용하여 Java Bean에 대한 응답을 deserialize하려고합니다.이기종 Json 객체를 사용한 Jackson 데이터 바인딩

JSON이 같은 인 예 :

{ 
    detail1: { property1:value1, property2:value2}, 
    detail2: { property1:value1, property2:value2}, 
    otherObject: {prop3:value1, prop4:[val1, val2, val3]} 
} 

본질적 detail1 및 detail2은 동일한 구조이며, OtherObject 다른 타입 인 반면, 따라서, 하나의 클래스 타입에 의해 표현 될 수있다. 다음과 같이

현재, 나는 내 수업을 설정 한 (이 내가 선호하는 구조입니다) : 다음

class ServiceResponse { 
    private Map<String, Detail> detailMap; 
    private OtherObject otherObject; 

    // getters and setters 
} 

class Detail { 
    private String property1; 
    private String property2; 

    // getters and setters 
} 

class OtherObject { 
    private String prop3; 
    private List<String> prop4; 

    // getters and setters 
} 

바로 수행

String response = <call service and get json response> 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(response, ServiceResponse.class) 

문제는 난입니다 내가 원하는 구조를 얻기 위해 매핑과 주석을 올바르게 구성하는 방법에 대한 설명서를 읽는 것을 잊어 버렸다. Detail1, detail2를 작성하여 DetailClass를 작성하고 otherObject를 사용하여 OtherObject 클래스를 작성하겠습니다.

그러나 세부 클래스를지도에 저장하여 쉽게 구별하고 검색 할 수 있으며 나중에 서비스가 detail3, detail4 등을 반환한다는 사실을 알고 싶습니다. , ServiceResponse의 맵은 "{detail1:Detail object, detail2:Detail object, ...}과 같을 것입니다.

어떻게 이러한 클래스에 주석을 추가해야합니까? 아니면이 JSON 모델에 맞게 클래스를 구성하는 더 좋은 방법이 있을까요? 어떤 도움을 주시면 감사하겠습니다.

답변

3

간단히과 같이, ServiceResponse에 2 인수 방식에 @JsonAnySetter을 사용 : 그것은 알 수없는 속성에 대한 대체입니다으로 만 @JsonAnySetter 하나 "속성"을 가질 수

@JsonAnySetter 
public void anySet(String key, Detail value) { 
    detailMap.put(key, value); 
} 

마음을 . JsonAnySetter의 javadoc은 1-arg 메소드에 적용되어야한다고 명시되어 있으므로 올바르지 않습니다. 당신은 항상 잭슨에서 사소한 버그를 열 수 있습니다.)

+0

아, 그 작품. 저는 대부분의 사람들이 진실한 지식의 근원 인 SO로 향하는 것처럼 문서를 대부분 포기했습니다. D. – nsx241

관련 문제