Когда используется свойство @JsonProperty и для чего оно используется?
этот боб 'состояние':
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 я не знаю, когда это необходимо использовать ?
8 ответов:
вот хороший пример. Я использую его для переименования переменной, потому что JSON исходит из
.Net
среда, где свойства начинаются с прописной буквы.public class Parameter { @JsonProperty("Name") public String name; @JsonProperty("Value") public String value; }
это правильно анализирует в / из JSON:
"Parameter":{ "Name":"Parameter-Name", "Value":"Parameter-Value" }
Я думаю, что OldCurmudgeon и StaxMan оба правы, но вот один ответ предложения с простым примером для вас.
@JsonProperty (name), сообщает Jackson ObjectMapper сопоставить имя свойства JSON с именем аннотированного поля Java.
//example of json that is submitted "Car":{ "Type":"Ferrari", } //where it gets mapped public static class Car { @JsonProperty("Type") public String type; }
ну за что его стоит сейчас... JsonProperty также используется для указания методов getter и setter для переменной, кроме обычной сериализации и десериализации. Например, предположим, что у вас есть полезная нагрузка:
{ "check": true }
и десериализатор класс:
public class Check { @JsonProperty("check") // It is needed else Jackson will look got getCheck method and will fail private Boolean check; public Boolean isCheck() { return check; } }
тогда в этом случае JsonProperty аннотация необходимости осуществляются. Однако если у вас также есть метод в классе
public class Check { //@JsonProperty("check") Not needed anymore private Boolean check; public Boolean getCheck() { return check; } }
посмотрите на эту документацию тоже: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
без аннотаций, выводимое имя свойства (чтобы соответствовать из JSON) будет "set", а не-как кажется, намерение - "isSet". Это связано с тем, что в соответствии со спецификацией Java Beans методы формы "isXxx" и "setXxx" принимаются за то, что есть логическое свойство "xxx" для управления.
как вы знаете, это все о сериализации и рассоления объекта. Предположим, что существует объект:
public class Parameter { public String _name; public String _value; }
сериализация этого объекта является:
{ "_name": "...", "_value": "..." }
имя переменной непосредственно используется для сериализации данных. Если вы собираетесь удалить системный api из реализации системы, в некоторых случаях вам нужно переименовать переменную в сериализации/десериализации. @JsonProperty-это метаданные, чтобы сообщить сериализатору, как последовательный объект. Он используется к:
- имя переменной
- доступ (чтение, запись)
- значение по умолчанию
- обязательный/дополнительный
пример:
public class Parameter { @JsonProperty( value="Name", required=true, defaultValue="No name", access= Access.READ_WRITE) public String _name; @JsonProperty( value="Value", required=true, defaultValue="Empty", access= Access.READ_WRITE) public String _value; }
как дополнение к другим ответы,
@JsonProperty
аннотация действительно важна, если вы используете@JsonCreator
аннотации в классах, которые не имеют конструктора no-arg.public class ClassToSerialize { public enum MyEnum { FIRST,SECOND,THIRD } public String stringValue = "ABCD"; public MyEnum myEnum; @JsonCreator public ClassToSerialize(MyEnum myEnum) { this.myEnum = myEnum; } public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST); String jsonString = mapper.writeValueAsString(classToSerialize); System.out.println(jsonString); ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class); System.out.println("StringValue: " + deserialized.stringValue); System.out.println("MyEnum: " + deserialized.myEnum); } }
в этом примере единственный конструктор помечен как
@JsonCreator
, поэтому Джексон будет использовать этот конструктор для создания экземпляра. Но выход такой:Сериализовано: {"stringValue": "ABCD", "myEnum":"FIRST"}
исключения в нить " главная" com.быстрее!Джексон.databind.экскавация.InvalidFormatException: не может построить экземпляр com.Авл.mbdtool.verificationmodule.исключение-документ.ClassToSerialize$MyEnum из строкового значения 'stringValue': значение не одно из объявленных перечислений имена экземпляров: [первый, второй, третий]
но после добавления
@JsonProperty
Аннотация В конструкторе:@JsonCreator public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) { this.myEnum = myEnum; }
десериализация прошла успешно:
сериализовать: {"myEnum":"FIRST","stringValue":"ABCD"}
StringValue: ABCD
MyEnum: первый
добавление JsonProperty также обеспечивает безопасность в случае, если кто-то решит, что они хотят изменить одно из имен свойств, не понимая, что рассматриваемый класс будет сериализован в объект Json. Если они изменяют имя свойства, JsonProperty гарантирует, что он будет использоваться в объекте Json, а не в имени свойства.