2013-06-03 1 views
8

Ho un DTO come questo:È possibile serializzare/deserializzare JSON in DTO Java con campi aggiuntivi che entrano in una mappa?

public Foo { 
    public int bar = 123; 
    public Map<String, Object> params; // key1=v1, key2=v2 etc. 
} 

vorrei che serializzare da/per la seguente JSON:

{ 
    "bar": 123, 
    "key1": "v1", 
    "key2": "v2" 
} 

Qualcuno sa come fare questo usando Jackson o Genson? Fondamentalmente voglio le conversioni di tipo automatico per i campi dichiarati nel DTO ma tutti gli "extra" per andare nella mappa dei parametri.

+2

utilizzando l'API di streaming di Jackson e una classe Builder per 'foo', sì, è possibile. Credo che Jackson abbia persino la possibilità di ingoiare "il resto" dei membri non mappati in un 'Map ', tuttavia non l'ho mai usato ... – fge

+0

potresti provare anche gson (ma funziona per la versione draft3) – Chris

+0

@David: Sono curioso del tuo caso d'uso che richiede quel tipo di struttura JSON. Cosa succede se 'params' ha una chiave con il nome' bar'? – nadirsaghar

risposta

4

Grazie a @fge per avermi messo sulla strada giusta. Jackson ha @JsonAnySetter e @JsonAnyGetter annotazioni che possono essere utilizzati per fare questo:

public Foo { 
    public int bar; 
    private transient Map<String, Object> params = new HashMap<String, Object>(); 

    @JsonAnySetter 
    public void set(String k, Object v) { params.put(k, v); } 

    @JsonAnyGetter 
    public Map getParams() { return params; } 
}