2016-06-21 27 views
7

Questo sembra che dovrebbe essere un problema abbastanza risolto/ben indirizzato, ma non sto trovando molte indicazioni su di esso - sperando che questo non sia un dupe.Deserializzazione del campo da oggetti nidificati all'interno della risposta JSON con Jackson

mio scenario è fondamentalmente che sto consumando impaginati risposte JSON che simile a questa:

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

Ovviamente questo è semplificato, ma si spera che ottiene il punto attraverso.

Tutto quello che mi interessa davvero sono i campi objects e next, ma sembra che dovrò creare un'intera gerarchia di DTO per deserializzare con successo i campi nidificati.

C'è un'annotazione di Jackson che mi consente di saltare tutto questo? In caso contrario, esiste una serie di best practice per fare ciò che non coinvolge una serie di classi e file per lo più vuoti?

risposta

8

C'è un'annotazione di Jackson che mi consente di saltare tutto questo?

È possibile utilizzare JsonDeserialize e definire JsonDeserializer personalizzato.

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(); 
    } 
} 

Qui ho utilizzato la semplice deserializzazione delle mappe, ma se si desidera è possibile implementare la propria deserializzazione rapida.

E l'oggetto

class MetaObject { 
    public List<Integer> objects; 

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

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

E se si richiama MetaObject result = mapper.readValue("...", MetaObject.class) otterrete ciò che volete

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

Sarebbe forse più facile utilizzare solo il sopra citato 'JsonDeserializer' con un'annotazione su un La proprietà 'String next' e fa finta che sia piatta, allo stesso livello di root di' "objects" '? –

+0

@ap, puoi usare questa annotazione in modo diverso, anche nella parte superiore della classe, qui la documentazione, https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind /annotation/JsonDeserialize.html – SerCe

+1

Per qualsiasi futuro quest, dovrei menzionare che la risposta sopra usa il metodo '.asText()', che sembra essere sbagliato. Ho finito con l'uso di '.textValue()' dopo alcuni tentativi e funziona come un incantesimo. –

Problemi correlati