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.
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'.
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.
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