Когда используется свойство @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 ? В чем преимущество его использования ? Я думаю, что могу удалить эту аннотацию, не вызывая никаких побочных эффектов.
чтение об этом annotion на 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), говорит Джексону 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 является neeeded. Однако если у вас также есть метод в классе
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": "..."
}
имя переменной непосредственно используется для сериализации данных. Если вы собираетесь удалить System 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.fasterxml.Джексон.метод databind.экскавация.InvalidFormatException: не может построить экземпляр com.Авл.mbdtool.verificationmodule.exceptiondocument.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, а не имя свойства.
от JsonProperty документации,
определяет имя логического свойства, т. е. имя поля объекта JSON для использования для свойства. Если value-пустая строка (по умолчанию), попробуйте использовать имя поля, которое аннотируется.