Сериализация JSON работает лучше всего, если вы сериализуете в строгие типы, поэтому каждый объект JSON обычно отображается непосредственно в класс Java.Если все ваши элементы выглядят так:
{
"id": "1",
"exp": 3600,
"secure": 0,
"instl": 1
}
, вы должны создать идентичный класс Java с геттерами и сеттерами
Class Item {
String id;
long exp;
int secure;
int instl;
// setters and getter
}
Подпись метода контроллера должна быть:
@RequestMapping(value= { "/request/{partner}"}, method =
RequestMethod.POST)
public Map<String, String> getRtbResponse(@RequestBody List<Item> data, @PathVariable String partner) {}
Если каждый партнер отправляет данные в разных форматах, решение может зависеть от погодных условий, в которых вам необходимо обрабатывать данные, или просто сохранять их.Если вам «просто» нужно хранить данные, а не обрабатывать их, вы можете использовать тот факт, что все объекты JSON могут обрабатываться как карты, поэтому ваш контроллер можно сделать так:
@RequestMapping(value= { "/request/{partner}"}, method =
RequestMethod.POST)
public Map<String, String>> getRtbResponse(@RequestBody List<Map<String, Object>> data, @PathVariable String partner) {}
Однако, если вам нужно обрабатывать данные каким-либо образом, использование Map<String, Object>
обычно не является хорошим планом.
В Java мы могли бы создать Interface PartnerItem
и несколько подклассов, каждый из которых соответствовал бы данным, представленным каждым партнером.Это также возможно в JSON, но поскольку у объектов JSON нет имени, его необходимо включить другим способом.Вот ссылка на руководство, которое объясняет , как работает наследование Джексона
Примечание : лично я никогда не использую массив в качестве структуры JSON верхнего уровня при разработке API, явсегда используйте объект.Причина в том, что я могу добавить дополнительные поля к объекту, что позволяет мне изменять API обратно совместимым способом - это невозможно, если ваша структура верхнего уровня представляет собой массив.