这个豆子“状态”:

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上阅读这个注释,我不知道什么时候需要使用这个?


当前回答

从JsonProperty javadoc,

定义逻辑属性的名称,即用于该属性的JSON对象字段名。如果value为空String(这是默认值),将尝试使用带注释的字段的名称。

其他回答

不管怎样,现在……除了通常的序列化和反序列化之外,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.13/com/fasterxml/jackson/annotation/JsonProperty.html

这里有一个很好的例子。我使用它来重命名变量,因为JSON来自于. net环境,其中属性以大写字母开头。

public class Parameter {
  @JsonProperty("Name")
  public String name;
  @JsonProperty("Value")
  public String value; 
}

这可以正确地解析JSON:

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}

从JsonProperty javadoc,

定义逻辑属性的名称,即用于该属性的JSON对象字段名。如果value为空String(这是默认值),将尝试使用带注释的字段的名称。

除了其他答案之外,如果在没有无参数构造函数的类中使用@JsonCreator注释,那么@JsonProperty注释就非常重要。

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,因此Jackson将使用该构造函数创建实例。但是输出是这样的:

序列化:{“stringValue”:“ABCD”、“myEnum”:“第一”} 异常 线程“主要” invalidformatexception:不能 构造的实例 ClassToSerialize MyEnum美元 stringValue:不是已声明Enum的值 实例名:[FIRST, SECOND, THIRD]

但是在构造函数中添加了@JsonProperty注释之后:

@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
    this.myEnum = myEnum;
}

反序列化成功:

Serialized:{“myEnum”:“第一”、“stringValue”:“ABCD”了 StringValue: ABCD MyEnum:第一

添加JsonProperty还可以确保安全性,以防有人决定要更改其中一个属性名称,而没有意识到所讨论的类将被序列化为Json对象。如果他们改变了属性名,JsonProperty确保它将被用于Json对象,而不是属性名。