2013-03-15 9 views
23

Ho un'applicazione che memorizza alcuni dati in DynamoDB utilizzando Jackson per eseguire il marshalling del mio oggetto complesso in un JSON.Trasmissione di LinkedHashMap a un oggetto complesso

Per esempio l'oggetto che sto smistamento potrebbe essere simile a questo:

private String aString; 
private List<SomeObject> someObjectList; 

Dove SomeObject potrebbe essere simile a questo:

private int anInteger; 
private SomeOtherObject; 

e SomeOtherObject potrebbe essere simile a questo:

private long aLong; 
private float aFloat; 

Questo va bene a un oggetto non viene eseguito il marshalling e non viene memorizzato nel DB come una stringa JSON.

Quando arriva il momento di recuperare i dati da DynamoDB Jackson recupera automaticamente il JSON e lo converte indietro ... TRANNE che 'someObjectList' viene restituito come List<LinkedHashMap> non come List<SomeObject>! Questo è un comportamento standard per Jackson, non è un errore che ciò stia accadendo.

Quindi ora questo porta a un problema. Il mio codice base pensa che abbia a che fare con un List<SomeObject> ma la realtà è che sta gestendo un List<LinkedHashMap>! La mia domanda è: come posso riavere la mia LinkedHashMap in "SomeObject". Ovviamente questo è un processo manuale, ma quello che intendo è che non riesco nemmeno ad estrarre i valori.

Se faccio questo:

for (LinkedHashMap lhm : someObjectList) { 
    // Convert the values back 
} 

ottengo un errore di compilazione che mi diceva che someObjectList è di tipo 'SomeObject' non LinkedHashMap.

Se faccio questo:

for (SomeObject lhm : someObjectList) { 
    // Convert the values back 
} 

ottengo un errore di runtime che mi diceva che LinkedHashMap non può essere gettato a 'SomeObject'.

risposta

70

È possibile utilizzare ObjectMapper.convertValue(), valore per valore o anche per l'intera lista. Ma è necessario conoscere il tipo di convertirsi:

POJO pojo = mapper.convertValue(singleObject, POJO.class); 
// or: 
List<POJO> pojos = mapper.convertValue(listOfObjects, new TypeReference<List<POJO>>() { }); 

questo è funzionalmente uguale a se avete fatto:

byte[] json = mapper.writeValueAsBytes(singleObject); 
POJO pojo = mapper.readValue(json, POJO.class); 

ma evita effettiva serializzazione dei dati come JSON, invece di usare un evento in memoria sequenza come il passaggio intermedio.

+0

Tuttavia, il secondo esempio non richiede un riferimento statico al tipo POJO. –

+0

@ BoSøborgPetersen Non sono abbastanza sicuro di cosa intendi per ... – StaxMan

+0

Fantastico. L'unica cosa che dovevo fare è assicurarmi che la classe POJO contenga un costruttore predefinito (nel caso siano presenti altri costruttori parametrizzati) – Gnana