2013-05-15 33 views
32

Dire che ho la seguente classe:Qual è l'equivalente di deserializzazione di Jackson di @JsonUnwrapped?

public class Parent { 
    public int age; 
    @JsonUnwrapped 
    public Name name; 
} 

Produrre JSON:

{ 
    "age" : 18, 
    "first" : "Joey", 
    "last" : "Sixpack" 
} 

Come faccio a deserializzare questo ritorno nella classe genitore? Potrei usare @JsonCreator

@JsonCreator 
public Parent(Map<String,String> jsonMap) { 
    age = jsonMap.get("age"); 
    name = new Name(jsonMap.get("first"), jsonMap.get("last")); 
} 

Ma questo aggiunge anche efficace @JsonIgnoreProperties(ignoreUnknown=true) alla classe Parent, come tutte le proprietà mappa a qui. Quindi, se volessi che i campi JSON sconosciuti generassero un'eccezione, dovresti farlo tu stesso. Inoltre, se i valori della mappa potrebbero essere qualcosa di diverso dalle stringhe, dovresti eseguire alcuni tipi di controllo e conversione manuali. C'è un modo per Jackson di gestire questo caso automaticamente?

Edit: potrei essere pazzo, ma questo in realtà sembra funzionare nonostante non essere mai esplicitamente menzionati nella documentazione: http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
ero abbastanza sicuro che non ha funzionato per me in precedenza. Tuttavia, l'approccio proposto @JsonCreator potrebbe essere preferito quando è richiesta una logica personalizzata per deserializzare i tipi polimorfici non imbustati.

+2

Sei sicuro che '@ JsonUnwrapped' sta funzionando per la deserializzazione? Ho appena provato e sto ottenendo 'Impossibile leggere gli errori JSON: Uncecognized field ...' quando provo a deserializzare il JSON appiattito. –

risposta

26

È possibile utilizzare @JsonCreator con @JsonProperty per ogni campo:

@JsonCreator 
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName, 
     @JsonProperty("lastName") String lastName) { 
    this.age = age; 
    this.name = new Name(firstName, lastName); 
} 

Jackson non digitare il controllo e la verifica campo sconosciuto per voi in questo caso.

+1

Buon punto. Questo risponde alla domanda su come preservare il tipo di jackson/il controllo del campo in JsonCreators in generale, che potrebbe essere l'unica domanda utile rimanente. =) – Shaun

Problemi correlati