Когда используется свойство @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 118

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, а не в имени свойства.

от JsonProperty документации,

определяет имя логического свойства, т. е. имя поля объекта JSON, которое будет использоваться для свойства. Если значение пустая строка (которая является значением по умолчанию), будет пытаться использовать имя поля, которое аннотируется.