Джексон: парсинг json на карту для данной карты > - PullRequest
0 голосов
/ 04 февраля 2020

Мне дан сконфигурированный экземпляр Джексона ObjectMapper с некоторыми модулями, десериализаторами и примененными конфигурациями.

Также у меня есть "плоский" json, означающий либо отсутствие внутренних узлов, либо ObjectMapper способен анализировать эти внутренние узлы в один объект.

Я хочу проанализировать данные json до Map<String, Object> (имя свойства - десериализованный объект). Ожидаемые классы для каждого имени свойства json известны, поэтому я могу передать их как Map<String, Class<?>>. Как я могу заархивировать эту цель?

Это похоже на синтаксический анализ с jackson.reader().fotType(Pojo.class).readValue() для pojo, а затем сбор полей pojo с отражением. Но я хочу не извлекать класс pojo, избегать использования отражения и получать в результате карту, представленную только в json свойствах.

1 Ответ

0 голосов
/ 06 февраля 2020

Решение, основанное на Преобразование JsonNode в POJO :

  1. Разбор json в дерево
  2. Преобразование подузлов дерева в ожидаемые java объекты через treeToValue

Фрагмент:

public Map<String, Object> decode(String json, Map<String, Class<?>> propertyClasses) throws JsonProcessingException {
  final HashMap<String, Object> parsedFields = new HashMap<>();
  final Iterator<Map.Entry<String, JsonNode>> jsonNodes = jacksonReader.readTree(json).fields();
  while (jsonNodes.hasNext()) {
    final Map.Entry<String, JsonNode> jsonEntry = jsonNodes.next();
    final String propertyName = jsonEntry.getKey();
    final Class<?> propertyClass = propertyClasses.get(propertyName);
    final Object parsedField = jacksonReader.treeToValue(jsonEntry.getValue(), propertyClass);
    parsedFields.put(propertyName, parsedField);
  }
  return parsedFields;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...