Почему, когда конструктор аннотируется с помощью @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, которые используются для вызова конструктора.

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

  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • Обнаружено, что
  • Служба WCF Максимальная квота длины массива (16384) превышена
  • Преобразование записей в последовательную форму данных для отправки по HTTP
  • Как вы делаете глубокую копию объекта в .NET (например, C #)?
  • Информация о сериализации типов кеша Json.NET?
  • Как вы сериализуете объект на C ++?
  • Серийный цикл ActiveRecord с использованием JSON вместо YAML
  • Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson
  • Уничтожить stream массива json по одному элементу за раз
  • Удаление десериализации полиморфных classов json без информации о типе с использованием json.net
  • Interesting Posts

    Как получить размеры пикселей вместо pt?

    Форматы сжатия с хорошей поддержкой случайного доступа в архивах?

    Передать переменные jquery между iframe и parent

    Как использовать AOP с AspectJ для ведения журнала?

    В bash, как связать функциональный ключ с командой?

    Есть ли способ отключить видео YouTube от автоматического запуска в Firefox?

    Почему Хаскелл (иногда) называют «Лучшим императивным языком»?

    Сброс стека навигации для главного экрана (React Navigation and React Native)

    Как получить историю на response-router v4?

    Сектора жесткого диска по сравнению с треками

    Неожиданное значение из nativeGetEnabledTags: 0

    Я забыл пароль своего хранилища ключей, и я хочу установить apk в Google Play. Что я делаю?

    Как передать аргументы командной строки в приложение WinForms?

    FirebaseList – Невозможно получить доступ к данным синтаксического анализа, полученным из firebase

    Код запуска JQuery 2 секунды после последнего нажатия клавиши

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