Json десериализация
При попытке десериализовать JSON примерно такого вида
{"id":0,"name":"alexkekiy",
"coordinates":{"x":5,"y":6.6},"creationDate":"22-02-2024 07:24",
"health":4,"loyal":true,"height":5.5,"weaponType":"BOLT_PISTOL",
"chapter":{"name":"55","parentLegion":"","world":"ew"}
}
На выходе получается LinkedHashMap вместо нормального POJO, вследствие чего вылетает ClassCastException
Десериализую библиотекой Jackson следующим способом:
public static <T> ArrayList<T> readAndUpdate(String fileName) {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm"));
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
ArrayList<T> data = new ArrayList<>();
try (FileReader fis = new FileReader(fileName);
BufferedReader bfr = new BufferedReader(fis)) {
String line;
while ((line = bfr.readLine()) != null) {
data.add(mapper.readerFor(new TypeReference<T>() {}).readValue(line));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return data;
}
Метод вызывается в мейне
public static final PriorityQueue<SpaceMarine> collection = new PriorityQueue<>();
collection.addAll(readAndUpdate(fileName));
Теперь, собственно, занавес - если указать в typeReference не T, а SpaceMarine, все работает, но я хочу сохранить абстрактность конвертирующего метода.
Очевидно проблема в этом, но как ее решить, не понимаю
Ответы (1 шт):
Автор решения: TaranenkoAnt
→ Ссылка
Для того чтобы сохранить абстрактность можно использовать TypeReference в качестве параметра, чтобы передать информацию о типе:
public static <T> ArrayList<T> readAndUpdate(String fileName, TypeReference<T> typeReference) {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm"));
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
ArrayList<T> data = new ArrayList<>();
try (FileReader fis = new FileReader(fileName);
BufferedReader bfr = new BufferedReader(fis)) {
String line;
while ((line = bfr.readLine()) != null) {
data.add(mapper.readValue(line, typeReference));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return data;
}