Json со строками и массивами для сопоставления

#java #jackson

#java #джексон

Вопрос:

Допустим, у меня есть

 {
   "foo" : "bar",
   "other-foo": "baz",
   "list-foo" : [
      "x": "y",
      "w":"z"
    ]
}
  

Как я могу сделать это Map ? Я знаю, что могу использовать jackson…Но я действительно не могу назвать это Map<String, String> или Map<String, Object> или Map<String, List> есть ли хороший чистый способ, или ответ заключается в создании объекта, который представляет это полностью?

Комментарии:

1. Что именно вы хотите с этим сделать? (И вы могли бы сделать это Map<String, Map<String, String>> — но это не лучшая идея).

2. Просто хочу сделать это картой, чтобы потребитель сервиса мог извлекать необходимые значения. Возможно, лучшая идея — определить объект

Ответ №1:

Если вы не предоставляете ссылку на целевой класс или тип

  • Jackson автоматически десериализует объект json в Map<String,Object> , фактически реализованный с помощью LinkedHashMap<String,Object> , который сохраняет порядок свойств, найденных в JSON.

  • На карте будет запись с ключом «list-foo» и значением, равным Map<String,Object> .

Или вы можете определить специализированные классы для десериализации Джексона.

Джексон десериализует в классы, которые вы определяете, если это возможно.

Если вы предоставите Джексону Class или TypeReference в качестве целевого объекта, он попытается создать экземпляр запрошенного класса.

В общем случае вы можете предоставить класс, который соответствует одному из этих критериев

  • Класс представляет собой компонент с общедоступными установщиками, которые следуют соглашениям об именовании компонентов.

  • Класс имеет открытые поля-члены, которые соответствуют именам свойств json.

  • Класс имеет общедоступные методы установки, аннотированные аннотациями Джексона.

  • Класс реализует интерфейс JsonSerializable и имеет метод serialize.

  • Или если вы создали пользовательский сериализатор и связали его с классом, используя аннотации Джексона.

Любые поля-члены класса также могут быть десериализованы на основе тех же критериев или если они являются примитивными типами, перечислениями или коллекциями Java, распознанными Jackson.