Почему, когда конструктор аннотируется с помощью @JsonCreator, его аргументы должны быть аннотированы с помощью @JsonProperty?

В Jackson, когда вы комментируете конструктор с помощью @JsonCreator , вы должны аннотировать его аргументы с помощью @JsonProperty . Итак, этот конструктор

 public Point(double x, double y) { this.x = x; this.y = y; } 

становится следующим:

 @JsonCreator public Point(@JsonProperty("x") double x, @JsonProperty("y") double y) { this.x = x; this.y = y; } 

Я не понимаю, почему это необходимо. Не могли бы вы объяснить?

jackson должен знать, в каком порядке передать поля из объекта JSON в конструктор. Невозможно получить доступ к именам параметров в Java с помощью отражения – вот почему вы должны повторять эту информацию в аннотациях.

Имена параметров обычно недоступны кодом Java во время выполнения (поскольку это происходит от компилятора), поэтому, если вам нужна эта функциональность, вам нужно либо использовать встроенные функции Java 8, либо использовать библиотеку, такую ​​как ParaNamer, чтобы получить доступ к нему.

Поэтому, чтобы не использовать annotations для аргументов конструктора при использовании Jackson, вы можете использовать любой из этих двух модhive Jackson:

ДЖЕКСОН-модуль параметры наименования

Этот модуль позволяет получить аргументы конструктора без annotations при использовании Java 8 . Чтобы использовать его, вам сначала необходимо зарегистрировать модуль:

 ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new ParameterNamesModule()); 

Затем скомпилируйте свой код, используя флаг -parameters:

 javac -parameters ... 

Ссылка: https://github.com/FasterXML/jackson-modules-java8/tree/master/parameter-names

ДЖЕКСОН-модуль-paranamer

Этот другой просто требует, чтобы вы зарегистрировали модуль или сконфигурировали интроспекцию annotations (но не оба, как указано в комментариях). Он позволяет использовать аргументы конструктора без annotations в версиях Java до 1.8 .

 ObjectMapper mapper = new ObjectMapper(); // either via module mapper.registerModule(new ParanamerModule()); // or by directly assigning annotation introspector (but not both!) mapper.setAnnotationIntrospector(new ParanamerOnJacksonAnnotationIntrospector()); 

Ссылка: https://github.com/FasterXML/jackson-modules-base/tree/master/paranamer

Можно избежать аннотаций конструктора с помощью jdk8, где, возможно, компилятор вводит метаданные с именами параметров конструктора. Затем с помощью модуля jackson-module-parameter-names Jackson может использовать этот конструктор. Вы можете увидеть пример на пост jacksonа без аннотаций

  • Учебники Java ™ – получение имен параметров метода

Поскольку байт-код Java не сохраняет имена аргументов метода или конструктора.

Когда я это правильно понимаю, вы заменяете конструктор по умолчанию параметризованным и, следовательно, должны описывать ключи JSON, которые используются для вызова конструктора.

Как указано в аннотационной документации , аннотация указывает, что имя аргумента используется как имя свойства без каких-либо изменений, но его можно указать для непустого значения, чтобы указать другое имя:

  • Использование jQuery для захвата содержимого из iframe CKEditor
  • Json Сериализация Java, которая работает с GWT
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • jackson не десериализует общий список, который он сериализовал
  • Сериализация OpenCV Mat_
  • JSON.NET Parser * кажется * будет двойной сериализацией моих объектов
  • Как добавить тип в белый список политики сериализации GWT?
  • Сохранение / загрузка данных в Unity
  • ShouldSerialize * () vs * Условный шаблон условной сериализации
  • StackOverflowError при сериализации объекта в Java
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Interesting Posts

    Явный vs неявный вызов toString

    Как разрешить стандартным пользователям устанавливать программы?

    Как получить контактный идентификатор электронной почты?

    В машинописном тексте, что это такое! (восклицательный знак / взрыв) при разыменовании члена?

    Правильная идиома для управления несколькими связанными ресурсами в блоке try-with-resources?

    Почему диапазон работает так, как ожидалось?

    Подстрочные буквы в метке оси ggplot

    Не удается найти главный class в файле, составленном с помощью Ant

    Настройка Wi-Fi-маршрутизатора в качестве коммутатора для совместного использования интернет-соединений

    Android: Тост в streamе

    Сколько файлов может содержать папка Windows?

    Как анализировать XML с помощью анализатора SAX

    Очистка Windows 7 до резервного копирования Clonezilla

    Рабочие пространства Eclipse: зачем и почему?

    Как я могу найти сервисы zeroconf (Bonjour) на Android? У меня проблемы с jmDNS

    Давайте будем гением компьютера.