Экспорт / импорт файла JSON через Jackson-2.9.7

Эй, чувак,

В настоящее время я работаю над проектом, в котором пользователь должен иметь возможность импортировать / экспортировать данные программы в файл 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 при чтении, хотя после некоторых попыток я не могу сказать, что знаю, как действовать.

Экспорт / импорт файла JSON через Jackson-2.9.7

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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);

Пробовал это, и, хотя это привело меня вперед, теперь я столкнулся с проблемой, связанной с LocalDate, когда нет конструктора по умолчанию. Я нашел это, но, похоже, мало что делает.

Xariez 31.10.2018 12:12

А как насчет @JsonSerialize(using = LocalDateTimeSerializer.class) и @JsonDeserialize(using = LocalDateTimeDeserializer.class) с соответствующими свойствами Observation?

Yuriy Tsarkov 31.10.2018 12:24

Теперь я справился с этой ошибкой, я просто использовал не тот файл, по-видимому. Однако теперь я в основном вернулся к квадрату 1: LinkedHashMap не может быть преобразован в Map при запуске строки map = mapper.readValue(rawJson, typeRef)

Xariez 31.10.2018 12:29

вы пробовали создать собственный десериализатор?

Yuriy Tsarkov 31.10.2018 12:47

У меня нет, хотя я думаю об этом.

Xariez 31.10.2018 13:14

поделитесь результатом, как только попробуете это, пожалуйста

Yuriy Tsarkov 31.10.2018 13:18

Проблема решена! Я по ошибке объявил временную карту как TreeMap, а TypeReference как Map, и я думаю, это запутало ее. Тем не менее, отмечу ваш ответ как ответ! Спасибо!

Xariez 31.10.2018 13:23

Другие вопросы по теме