2016-06-21 47 views
7

Wygląda na to, że powinien to być dość rozwiązany/dobrze rozwiązany problem, ale nie znajduję w nim wielu wskazówek - mając nadzieję, że to nie jest dupe.Usuwanie pola z obiektów zagnieżdżonych w ramach odpowiedzi JSON z Jackson

Mój scenariusz jest po prostu, że jestem zużywa paginowane odpowiedzi JSON, które wyglądają mniej więcej tak:

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

Oczywiście jest to uproszczenie, ale miejmy nadzieję, że dostaje punkt w poprzek.

Wszystko, co naprawdę mnie interesuje, to pola objects i , ale wygląda na to, że będę musiał stworzyć całą hierarchię DTO, aby pomyślnie deserializować zagnieżdżone pola.

Czy istnieje adnotacja jackson, która pozwoliłaby mi pominąć to wszystko? Jeśli nie, czy istnieje zestaw sprawdzonych metod postępowania, który nie obejmuje większości pustych klas i plików?

Odpowiedz

8

Czy istnieje adnotacja jackson, która pozwoliłaby mi pominąć to wszystko?

Można użyć JsonDeserialize i zdefiniować niestandardowy 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(); 
    } 
} 

Tutaj użyłem prostej deserializacji mapy, ale jeśli chcesz, możesz wdrożyć własną szybką deserializację.

a obiekt

class MetaObject { 
    public List<Integer> objects; 

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

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

A jeśli powołać MetaObject result = mapper.readValue("...", MetaObject.class) dostaniesz co chcesz

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

Czy to może być łatwiej po prostu użyć ww 'JsonDeserializer' z dopiskiem na "String next" właściwość i po prostu udawaj, że jest płaska, na tym samym poziomie katalogu głównego co '" obiekty "'? –

+0

@ap, Możesz użyć tej adnotacji w inny sposób, nawet w górnej części klasy, tutaj dokumentacja, https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind /annotation/JsonDeserialize.html – SerCe

+1

Dla przyszłych misjonarzy, powinienem wspomnieć, że powyższa odpowiedź używa metody '.asText()', która wydaje się błędna. Skończyło się na użyciu '.textValue()' po trochę pracy i działa jak urok. –