Почему, когда конструктор аннотируется с помощью @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; }
Я не понимаю, почему это необходимо. Не могли бы вы объяснить?
- Java: объект для байта и байт для конвертера объектов (для Tokyo Cabinet)
- Сериализовать статический class?
- Сериализация JSON массива с полиморфными объектами
- Как можно полиморфная десериализация Json String с использованием Java и библиотеки Jackson?
- Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
- Как сериализовать объект в CSV-файл?
- Сериализация нулевого значения в JSON.NET
- jackson не десериализует общий список, который он сериализовал
- Специальная сериализация Jackson JSON для определенных полей
- GSON десериализует значение ключа для пользовательского объекта
- gwt - Использование списка в вызове RPC?
- Джерси + jackson JSON формат даты формат - как изменить формат или использовать пользовательские JacksonJsonProvider
- C # десериализация структуры после ее получения через TCP
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, которые используются для вызова конструктора.
Как указано в аннотационной документации , аннотация указывает, что имя аргумента используется как имя свойства без каких-либо изменений, но его можно указать для непустого значения, чтобы указать другое имя: