Java @JsonProperty属性是什么时候使用的,它的用途是什么?

Java @JsonProperty属性是什么时候使用的,它的用途是什么?,java,ajax,jackson,Java,Ajax,Jackson,这个bean的“状态”: public class State { private boolean isSet; @JsonProperty("isSet") public boolean isSet() { return isSet; } @JsonProperty("isSet") public void setSet(boolean isSet) { this.isSet = isSet; }

这个bean的“状态”:

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 : function(response) {  
            if(response.State.isSet){   
                alert('success called successfully)
            }
此处是否需要注释@JsonProperty?使用它有什么好处? 我想我可以删除这个注释而不会产生任何副作用


阅读关于“我不知道何时需要使用”的注释?

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

public class Parameter {
  @JsonProperty("Name")
  public String name;
  @JsonProperty("Value")
  public String value; 
}
这将正确解析JSON:

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

如果没有注释,推断出的属性名(要与JSON匹配)将是“set”,而不是——正如意图所示——“isSet”。这是因为根据JavaBeans规范,形式为“isXxx”和“setXxx”的方法被认为意味着有逻辑属性“xxx”需要管理。

我认为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;
  }
}
也请查看此文档:

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

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 javadoc

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


除了其他答案之外,如果在没有无参数构造函数的类中使用
@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”:“FIRST”}

例外情况 线程“main” com.fasterxml.jackson.databind.exc.InvalidFormatException:无法 构造实例 ClassToSerialize$MyEnum 来自字符串值“stringValue”:值不是声明的枚举之一 实例名称:[第一、第二、第三]

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

@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
    this.myEnum = myEnum;
}
反序列化成功:

序列化:{“myEnum”:“FIRST”,“stringValue”:“ABCD”}

字符串值:ABCD

迈纳姆:第一


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

除了上面的所有答案之外,不要忘记文档中的以下部分

标记注释,可用于将非静态方法定义为 逻辑属性的“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()
  • 来自
    getId()的id
  • idAndUsername来自
    getIdAndUsername
    *
既然方法
getIdAndUsername
get
开头,那么它就被视为普通的getter,因此,为什么可以用
@JsonIgnore
注释这样的方法呢


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

不能将字符串成员变量重命名为其正确的大小写,以便公开字符串名称;成为公共字符串名称?是的,它们可以,但是在Java环境中,它们与编码标准不匹配。更多的是关于我的学究作风,这是一个真正的编码问题,但这是一个真正使用
@JsonProperty
注释的很好但很简单的例子。这个注释可以用于
Double
类型的成员吗?我只是想知道类型是否必须是
String
或JSON支持的任何类型?它可能是任何类型的吗@OldCurmudgeon@Dreamer对类型与此无关。这只影响名称。@Pavan-这与命名无关。我想您应该检查一下setter。类名是否应该与JSON的根元素相同。这对我不起作用。这是问题中给出的具体案例的正确答案