#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 быть расширенным, чтобы также обрабатывать регистр карты, хотя, похоже, он применим только для сериализации (не уверен, как можно десериализовать обратно).