Преобразование json в карту с помощью Jackson

#java #json #deserialization #jackson #unmarshalling

#java #json #десериализация #джексон #отмена сопоставления

Вопрос:

В настоящее время я использую библиотеку Jackson для преобразования json в pojos с помощью аннотаций.

Дерево json, которое я хотел бы разобрать, выглядит следующим образом:

 {
    "key1":"value1",
    "key2":"value2",
    "key3":{
        "key31":{
            "key311":"value311",
            "key312":"value312",
            "key313":"value313"
        },
        "key32":"value32"
    },
    "key4":"value4",
    "key5":"value5",
    "key6":{
        "key61":"value61"
    }
}
  

Я не знаю структуру json заранее и хотел бы полностью сгладить ее до карты, содержимое которой было бы эквивалентно:

 Map<String, Object> outputMap = new HashMap<String, Object>();
outputMap.put("key1", "value1");
outputMap.put("key2", "value2");
outputMap.put("key311", "value311");
outputMap.put("key312", "value312");
outputMap.put("key313", "value313");
outputMap.put("key32", "value32");
outputMap.put("key4", "value4");
outputMap.put("key5", "value5");
outputMap.put("key61", "value61");
  

(обратите внимание, что ключи «key3», «key31» и «key6» следует игнорировать)

Используя аннотацию @JsonAnySetter , я могу создать функцию для заполнения карты всеми атомами верхнего уровня, но метод также будет перехватывать узел, имеющий дочерние элементы (когда значением является карта).

С этого момента я, конечно, могу сам написать простую рекурсию над дочерними элементами, но я бы хотел, чтобы эта часть обрабатывалась автоматически (элегантным способом) с помощью средства из библиотеки (аннотации, конфигурации и т. Д.), И мне не нужно было писать рекурсию самостоятельно.

Примечание: мы предполагаем, что в ключах разных уровней нет столкновения имен.

Ответ №1:

Насколько я знаю, для этого не существует механизма, основанного на аннотациях, поскольку @JsonUnwrapped, который может быть применим, можно использовать только с POJO, а не с Maps. Я думаю, вы могли бы подать запрос на улучшение, чтобы попросить @JsonUnwrapped быть расширенным, чтобы также обрабатывать регистр карты, хотя, похоже, он применим только для сериализации (не уверен, как можно десериализовать обратно).