2016-06-21 8 views
7

이것은 상당히 해결되었거나 잘 해결 된 문제인 것처럼 보입니다. 그러나 이것에 대해서는 많은 지침을 찾지 못하고 있습니다. 분명히이 단순화Jackson과 JSON 응답 내에서 중첩 된 객체의 필드 비 직렬화

{ 
    "objects": [...], 
    "meta": { 
    "total": 5000, 
    "page": 1, 
    "result_pages": 20, 
    "links": { 
     "prev": null, 
     "next": "/api/v3/objects/somequery?page=2" 
    } 
    } 
} 

, 그러나 희망이 가로 질러 점을 가져옵니다

내 시나리오는 내가 매겨진 된 JSON과 같이 보일 반응을 소모하고 있다는 기본적으로.

내가 정말로 신경 쓰는 건 objectsnext 필드이지만, 중첩 된 필드를 성공적으로 비 직렬화하기 위해서는 DTO의 전체 계층 구조를 만들어야 할 것처럼 보입니다.

이 모든 것을 건너 뛸 수있는 잭슨 주석이 있습니까? 그렇지 않은 경우, 주로 비어있는 클래스와 파일을 포함하지 않는 모범 사례가 있습니까?

답변

8

이 모든 것을 건너 뛸 수있는 잭슨 주석이 있습니까?

사용자 정의 JsonDeserializer를 정의 할 수 있습니다.

class MetaDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { 
     JsonNode tree = jp.readValueAsTree(); 
     return tree.get("links").get("next").asText(); 
    } 
} 

여기에서는 간단한 맵 deserialization을 사용했지만, 원하는 경우 직접적인 deserialization을 구현할 수 있습니다.

그리고 객체

class MetaObject { 
    public List<Integer> objects; 

    @JsonDeserialize(using = MetaDeserializer.class) 
    public String meta; 

    @Override 
    public String toString() { 
     return "MetaObject{" + "objects=" + objects + ", meta='" + meta + '\'' + '}'; 
    } 
} 

그리고 당신은 MetaObject result = mapper.readValue("...", MetaObject.class)를 호출 할 경우, 당신은 당신이

MetaObject{objects=[1, 2, 3], meta='/api/v3/objects/somequery?page=2'} 
+1

어쩌면 단지에 주석 위에서 언급 한'JsonDeserializer'을 사용하기가 더 쉬울 수있다 원하는 것을 얻을 것이다 'String next' 속성을 사용하고''objects "'와 같은 루트 수준에서 평평한 척하십시오. –

+0

@ap,이 주석은 클래스 상단에서도 다르게 사용할 수 있습니다.이 문서는 https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind에 있습니다. /annotation/JsonDeserialize.html – SerCe

+1

앞으로의 모든 질문에 대해서는 위의 대답은 잘못된 것으로 보이는'.asText()'메소드를 사용한다는 것을 언급해야합니다. 나는'.textValue()'를 사용하여 작업을 끝내고 결국 매력처럼 작동한다. –

관련 문제