何时使用@jsonproperty属性,它的用途是什么?

isr3a4wc  于 2021-07-08  发布在  Java
关注(0)|答案(9)|浏览(521)

这个“状态”:

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 我不知道什么时候需要用这个?

o7jaxewo

o7jaxewo1#

如果没有注解,推断出的属性名(与json匹配)将是“set”,而不是——似乎是意图——是“isset”。这是因为根据javabeans规范,形式为“is”和“set”的方法意味着要管理逻辑属性“”。

63lcw9qa

63lcw9qa2#

我认为oldcurmudgeon和staxman都是正确的,但这里有一个简单的例子回答你一句话。
@jsonproperty(name)告诉jackson objectmapper将json属性名Map到带注解的java字段名。

//example of json that is submitted 
"Car":{
  "Type":"Ferrari",
}

//where it gets mapped 
public static class Car {
  @JsonProperty("Type")
  public String type;
 }
k10s72fa

k10s72fa3#

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

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; 
}
svdrlsy4

svdrlsy44#

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

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

这将正确解析json:

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

0x6upsns5#

不管它现在值多少钱。。。除了通常的序列化和反序列化之外,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

rjee0c15

rjee0c156#

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

eqfvzcg8

eqfvzcg87#

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

zujrkrfu

zujrkrfu8#

除了以上所有的答案,别忘了文档中提到
标记注解,可用于将非静态方法定义为逻辑属性的“setter”或“getter”(取决于其签名),或将非静态对象字段定义为逻辑属性(序列化、反序列化)。
如果你有 non-static 在你的课堂上不是一个传统的方法 getter or setter 然后你可以让它像一个 getter and 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来自 getId() idandusername来自 getIdAndUsername *
因为这个方法 getIdAndUsername 开始于 get 然后它被视为普通的getter,因此,为什么可以用 @JsonIgnore .
如果你注意到 concatenateIdAndUsername 不会返回,这是因为它的名称不以 get 如果您希望该方法的结果包含在响应中,那么您可以使用 @JsonProperty("...") 这将被视为正常 getter/setter 如上述突出显示的文档所述。

f45qwnt8

f45qwnt89#

除了其他答案, @JsonProperty 如果您使用 @JsonCreator 没有无参数构造函数的类中的注解。

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”:“d”,“myenum”:“first”}
线程“main”com.fasterxml.jackson.databind.exc.invalidformatexception中出现异常:无法从字符串值“stringvalue”构造classtoserialize$myenum的示例:值不是声明的枚举示例名称之一:[first,second,third]
但在加入 @JsonProperty 构造函数中的注解:

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

反序列化成功:
序列化:{“myenum”:“first”,“stringvalue”:“d”}
stringvalue:d
髓鞘:第一个

相关问题