Этот боб 'State':
public class State {
private boolean isSet;
@JsonProperty("isSet")
public boolean isSet() {
return isSet;
}
@JsonProperty("isSet")
public void setSet(boolean isSet) {
this.isSet = isSet;
}
}
отправляется по сети с помощью обратного вызова ajax 'success':
success : function(response) {
if(response.State.isSet){
alert('success called successfully)
}
Здесь требуется аннотация @JsonProperty? В чем преимущество его использования? Я думаю, что могу удалить эту аннотацию, не вызывая побочных эффектов.
Читая об этом аннексе по адресу https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Я не знаю, когда это необходимо использовать?
Ответы:
Вот хороший пример. Я использую его для переименования переменной, потому что JSON исходит из
.Net
среды, в которой свойства начинаются с заглавной буквы.Это правильно анализирует в / из JSON:
источник
@JsonProperty
аннотации.Double
? Мне просто интересно, должен ли тип бытьString
или какой-либо тип, который поддерживает JSON? Может ли это быть какой-нибудь тип? @OldCurmudgeonЯ думаю, что OldCurmudgeon и StaxMan оба верны, но вот одно предложение с простым примером для вас.
@JsonProperty (name), сообщает Jackson ObjectMapper сопоставить имя свойства JSON с именем аннотированного поля Java.
источник
хорошо для того, что это стоит сейчас ... JsonProperty также используется для определения методов получения и установки для переменной помимо обычной сериализации и десериализации. Например, предположим, что у вас есть полезная нагрузка, подобная этой:
и класс десериализатора:
Тогда в этом случае аннотация JsonProperty необходима. Однако, если у вас также есть метод в классе
Ознакомьтесь также с этой документацией: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html.
источник
Без аннотаций выведенное имя свойства (для сопоставления с JSON) будет «задано», а не - как кажется, намерение - «isSet». Это связано с тем, что согласно спецификации Java Beans методы формы "isXxx" и "setXxx" означают, что существует логическое свойство "xxx" для управления.
источник
Как вы знаете, это все о сериализации и опреснении объекта. Предположим, есть объект:
Сериализация этого объекта:
Имя переменной напрямую используется для сериализации данных. Если вы собираетесь удалить системный API из системной реализации, в некоторых случаях вам придется переименовать переменную в сериализации / десериализации. @JsonProperty - это метаданные, чтобы сообщить сериализатору, как выполнять последовательный объект. Он используется для:
из примера:
источник
Добавление JsonProperty также обеспечивает безопасность в случае, если кто-то решит, что он хочет изменить одно из имен свойств, не осознавая, что рассматриваемый класс будет сериализован в объект Json. Если они меняют имя свойства, JsonProperty гарантирует, что оно будет использоваться в объекте Json, а не имя свойства.
источник
В дополнение к другим ответам,
@JsonProperty
аннотация действительно важна, если вы используете@JsonCreator
аннотацию в классах, которые не имеют конструктора без аргументов.В этом примере единственный конструктор помечен как
@JsonCreator
, поэтому Джексон будет использовать этот конструктор для создания экземпляра. Но вывод выглядит так:Но после добавления
@JsonProperty
аннотации в конструкторе:Десериализация прошла успешно:
источник
В дополнение ко всем ответам выше, не забывайте часть документации, которая говорит
Если
non-static
в вашем классе есть метод, который не является традиционным,getter or setter
вы можете заставить его действовать как agetter and setter
, используя аннотацию к нему. Смотрите пример нижеКогда вышеуказанный объект сериализуется, тогда ответ будет содержать
getUsername()
getId()
getIdAndUsername
*Так как метод
getIdAndUsername
начинается с того, чтоget
он рассматривается как обычный метод получения , поэтому вы можете аннотировать это с помощью@JsonIgnore
.Если вы заметили, что
concatenateIdAndUsername
оно не возвращено, и это потому, что его имя не начинается с,get
и если вы хотите, чтобы результат этого метода был включен в ответ, то вы можете использовать@JsonProperty("...")
его, и он будет рассматриваться как обычный,getter/setter
как упомянуто в выделенной выше документации ,источник
От JsonProperty Javadoc,
источник