Использование Джексона для десериализации JSON на карту - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь найти простой способ десериализации следующего JSON к объекту OpeningHours, содержащему Map<String, List<String>>, который содержит дни в качестве ключей и часы работы в виде списка.

Я использую Джексон и создал свой собственный десериализатор @JsonDeserialize(using = MyDeserializer.class) Проблема в том, что мне нужно проверить, какой из различных JSON узлов присутствует, чтобы установить ключи для карты.

Есть ли простое альтернативное решение?

{
  "OpeningHours": {
    "Days": {
      "Monday": {
        "string": [
          "09:00-13:00",
          "13:30-18:00"
        ]
      },
      "Tuesday": {
        "string": [
          "09:00-13:00",
          "13:30-18:00"
        ]
      }
    }
  }
}

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Джексон может десериализовать любой Json в Map<String, Object>, который может содержать вложенные карты для вложенных json объектов. все, что нужно, это кастинг:

String json = ...
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> openingHours = (Map<String, Object>)mapper.readValue(json, Map.class);
Map<String, List<String>> days = (Map<String, List<String>>)((Map<String, Object>)openingHours.get("OpeningHours")).get("Days");
System.out.println(days);

вывод:

 {Monday={string=[09:00-13:00, 13:30-18:00]}, Tuesday={string=[09:00-13:00, 13:30-18:00]}}
0 голосов
/ 29 января 2020

Я думаю, что вы делаете проблему немного сложнее, чем она есть. В этом случае вам не нужен специальный десериализатор. Все, что вам нужно, это:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModules(new JavaTimeModule());
ObjectReader obrecjReader = objectMapper.reader();
Map<String, Object> myMap = objectReader.forType(Map<String,Object>.class).readValue(jsonString);
0 голосов
/ 29 января 2020

Вы можете просто десериализовать его в структуру данных, которая представляет JSON как

@Data
public class TempStore {

    private List<DayTempStore> days;
}

@Data 
public class DaytempStore {

    private String[] string;
}

, и просто преобразовать это в карту>, оставляя хлопоты с узлами и проверками для Джексона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...