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