Rzutowanie LinkedHashMap do złożonego obiektu

Mam aplikację, która przechowuje niektóre dane w DynamoDB, używając Jacksona do przekształcenia mojego złożonego obiektu w JSON.

Na przykład obiekt, który robię, może wyglądać tak:

private String aString;
private List<SomeObject> someObjectList;

Gdzie jakiś obiekt może wyglądać tak:

private int anInteger;
private SomeOtherObject;

A jakis inny obiekt moze wygladac tak:

private long aLong;
private float aFloat; 

Jest to w porządku, a obiekt jest bez problemu ustawiany i przechowywany w DB jako ciąg JSON.

Kiedy przyjdzie czas na pobranie danych z DynamoDB Jackson automatycznie pobiera JSON i konwertuje go z powrotem... Z tym wyjątkiem, że 'someObjectList' jest zwracany jako List<LinkedHashMap>, a nie jako List<SomeObject>! To jest standardowe zachowanie Jacksona, nie jest błędem, że to się dzieje.

Więc teraz to prowadzi do problemu. Moja baza kodów myśli, że ma do czynienia z List<SomeObject>, ale rzeczywistość jest taka, że ma do czynienia z List<LinkedHashMap>! Moje pytanie brzmi, jak Mogę dostać mój LinkedHashMap z powrotem do 'SomeObject'. Oczywiście jest to proces ręczny, ale chodzi mi o to, że nie mogę nawet wyodrębnić wartości.

Jeśli to zrobię:

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

Pojawia się błąd kompilacji mówiący, że someObjectList jest typu 'SomeObject', a nie LinkedHashMap.

Jeśli to zrobię:

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

Pojawia się błąd runtime mówiący mi, że LinkedHashMap nie może być wyrzucony do 'SomeObject'.

Author: Sam Berry, 2013-03-15

1 answers

Możesz użyć ObjectMapper.convertValue(), wartość po wartości lub nawet dla całej listy. Ale musisz znać typ do konwersji:

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

To jest funkcjonalnie takie samo, jak gdybyś to zrobił:

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

Ale unika rzeczywistej serializacji danych jako JSON, zamiast tego używa sekwencji zdarzeń w pamięci jako kroku pośredniego.

 84
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-16 18:42:12