2013-03-15 14 views
23

Mam aplikację, która przechowuje dane w DynamoDB za pomocą Jacksona, aby przekazać mój złożony obiekt do JSON.Przesyłanie obiektu LinkedHashMap do obiektu złożonego

Na przykład obiekt jestem etapowy może wyglądać następująco:

private String aString; 
private List<SomeObject> someObjectList; 

Gdzie SomeObject może wyglądać następująco:

private int anInteger; 
private SomeOtherObject; 

i SomeOtherObject może wyglądać następująco:

private long aLong; 
private float aFloat; 

To jest w porządku, ponieważ obiekt jest ładowany bez problemu i przechowywany w DB jako ciąg JSON.

Kiedy przychodzi czas, aby odzyskać dane z DynamoDB Jackson automatycznie pobiera JSON i konwertuje go z powrotem ... oprócz tego, że „someObjectList” jest zwracany jako nie List<LinkedHashMap> jako List<SomeObject>! Jest to standardowe zachowanie Jacksona, nie jest to pomyłka, że ​​tak się dzieje.

Więc teraz to prowadzi do problemu. Moja baza kodowa myśli o tym, że ma do czynienia z List<SomeObject>, ale w rzeczywistości jest to obsługa List<LinkedHashMap>! Moje pytanie brzmi: w jaki sposób mogę przenieść moją LinkedHashMap w "SomeObject". Oczywiście jest to proces ręczny, ale mam na myśli to, że nie mogę nawet wyodrębnić wartości.

Gdybym to zrobić:

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

otrzymuję błąd kompilacji mówi mi, że someObjectList jest typu „SomeObject” nie LinkedHashMap.

Gdybym to zrobić:

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

otrzymuję błąd wykonania mówi mi, że LinkedHashMap nie może być rzucony na „SomeObject”.

Odpowiedz

70

Można użyć wartości ObjectMapper.convertValue(), wartości według wartości lub nawet dla całej listy. Ale trzeba znać typ konwersji do:

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

ten jest funkcjonalnie takie same jak gdybyś zrobił:

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

ale unika rzeczywistego serializacji danych jak JSON, zamiast przy użyciu zdarzenie w pamięci sekwencja jako etap pośredni.

+0

Jednak drugi przykład nie wymaga statycznego odniesienia do typu POJO. –

+0

@ BoSøborgPetersen Nie jestem całkiem pewien, co masz na myśli przez to ... – StaxMan

+0

Awesome. Jedyne, co musiałem zrobić, to upewnić się, że klasa POJO zawiera domyślny konstruktor (w przypadku innych konstruktorów sparametryzowanych). – Gnana

Powiązane problemy