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