Сглаживание JSON на карте с Джексоном - PullRequest
1 голос
/ 27 октября 2011

В настоящее время я использую библиотеку Джексона для демаршалирования 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).

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

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

1 Ответ

1 голос
/ 27 октября 2011

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

...