这个豆子“状态”:

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


当前回答

如您所知,这都是关于序列化和淡化对象的。假设有一个对象:

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

如果没有注释,推断的属性名称(从JSON匹配)将是“set”,而不是“isSet”,这似乎是意图。这是因为根据Java Beans规范,形式为“isXxx”和“setXxx”的方法表示有一个逻辑属性“xxx”需要管理。

除了上面所有的答案之外,不要忘记文档中说

标记注释,可用于将非静态方法定义为 "setter"或"getter"用于逻辑属性(取决于其 签名),或使用的非静态对象字段(序列化的, 反序列化)作为逻辑属性。

如果你的类中有一个非静态方法,它不是常规的getter或setter,那么你可以通过使用它上的注释使它像getter和setter一样。参见下面的示例

public class Testing {
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getIdAndUsername() {
        return id + "." + username; 
    }

    public String concatenateIdAndUsername() {
        return id + "." + username; 
    }
}

当上述对象被序列化时,则响应将包含

getUsername()中的用户名 id from getId() 来自getIdAndUsername*的idAndUsername

由于方法getIdAndUsername以get开头,那么它被视为普通的getter,因此,为什么你可以用@JsonIgnore注释。

如果你注意到concatenateIdAndUsername没有返回,那是因为它的名称不是以get开头的,如果你希望该方法的结果包含在响应中,那么你可以使用@JsonProperty(“…”),它将被视为上面突出显示的文档中提到的普通getter/setter。