Эй, чувак,
В настоящее время я работаю над проектом, в котором пользователь должен иметь возможность импортировать / экспортировать данные программы в файл JSON (типа TreeMap<String, List<Observation>>
, где Observation - это класс, содержащий LocalDate date
и int value
).
Для реализации экспортной части я использовал некоторые из JAR-файлов Jackson 2.9.7, чтобы получить доступ к ObjectMapper и, таким образом, экспортировать данные в файл JSON. Работает!
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(file, handler.get(LocalDate.MIN, LocalDate.MAX));
Однако для достижения части импорта я снова использовал файлы JAR Jackson 2.9.7, чтобы получить доступ к объектному сопоставителю, который снова, Работает!
byte[] rawJson = new byte[dStream.available()];
ObjectMapper mapper = new ObjectMapper();
dStream.readFully(rawJson);
map = mapper.readValue(rawJson, TreeMap.class);
Однако, когда я пытаюсь добавить элементы, которые я теперь импортировал, во временную карту, структура уже не такая, как я ожидал. Вместо этого он, кажется, преобразовал его в LinkedHashMap с несколькими записями, и поэтому я не могу просто использовать класс Observation
. Я предполагаю, что это потому, что я использую TreeMap.class
при чтении, хотя после некоторых попыток я не могу сказать, что знаю, как действовать.
Используйте TypeReference
:
записывать:
TypeReference<Map<String, List<Observation>>> typeRef =
new TypeReference<Map<String, List<Observation>>>() {};
ObjectMapper mapper = new ObjectMapper();
mapper.writerFor(typeRef).writeValue(file, handler.get(LocalDate.MIN, LocalDate.MAX));
читать:
byte[] rawJson = new byte[dStream.available()];
TypeReference<Map<String, List<Observation>>> typeRef =
new TypeReference<Map<String, List<Observation>>>() {};
ObjectMapper mapper = new ObjectMapper();
dStream.readFully(rawJson);
map = mapper.readValue(rawJson, typeRef);
А как насчет @JsonSerialize(using = LocalDateTimeSerializer.class)
и @JsonDeserialize(using = LocalDateTimeDeserializer.class)
с соответствующими свойствами Observation
?
Теперь я справился с этой ошибкой, я просто использовал не тот файл, по-видимому. Однако теперь я в основном вернулся к квадрату 1: LinkedHashMap не может быть преобразован в Map при запуске строки map = mapper.readValue(rawJson, typeRef)
вы пробовали создать собственный десериализатор?
У меня нет, хотя я думаю об этом.
поделитесь результатом, как только попробуете это, пожалуйста
Проблема решена! Я по ошибке объявил временную карту как TreeMap, а TypeReference как Map, и я думаю, это запутало ее. Тем не менее, отмечу ваш ответ как ответ! Спасибо!
Пробовал это, и, хотя это привело меня вперед, теперь я столкнулся с проблемой, связанной с LocalDate, когда нет конструктора по умолчанию. Я нашел это, но, похоже, мало что делает.