Как десериализовать массив с лидирующей меткой впереди без использования объекта-обертки? - PullRequest
0 голосов
/ 16 января 2020

Мой веб-сервис (WS) получает запрос HTTP POST, и JacksonJsonProvider десериализует входящий объект тела в строку JSON. DTO прост:

public class SettingDTO {
   private String key;
   private String value;
   ...
}

Подпись WS выглядит следующим образом:

@Post
Response saveList(List<SettingDTO> list);

WS ожидает массив на входе. Пример:

{
    "settings": [
        {
            "key": "key1",
            "value": "val1"
        },
        {
            "key": "key2",
            "value": "val2"
        }
    ]
}

Это приводит к исключению. Джексон не знает, как обращаться с лидирующей меткой «настройки». Если я попробую это без метки, просто с простым массивом, он будет работать хорошо. Но установлено требование использовать его таким, какой он есть.

Одно из известных мне решений - использовать объект-обертку, еще один DTO. Интересно, можно ли это решить без дополнительной обертки? Может быть, аннотацию сработает?

После десериализации я хочу в итоге заполнить List<Setting> settings ...

1 Ответ

0 голосов
/ 17 января 2020

Есть несколько способов достичь этого. Но если вы не хотите использовать дополнительный класс-оболочку, один из способов - сначала прочитать внутреннюю строку JSON, а затем десериализовать ее до List<SettingDTO> следующим образом:

Фрагмент кода

ObjectMapper mapper = new ObjectMapper();      
JsonNode root = mapper.readTree(jsonStr);
String settingsStr = root.get("settings").toString();
List<SettingDTO> settings = mapper.readValue(settingsStr, new TypeReference<List<SettingDTO>>(){});
System.out.println(settings.toString());

Выход на консоль

[SettingDTO [ключ = ключ1, значение = val1], SettingDTO [ключ = ключ2, значение = val2]]


Кстати, если вы пытались добавить @JsonRootName(value = "settings") в класс SettingDTO, AFAIK, он не работает для JSON массива!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...