这个豆子“状态”:
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还用于为变量指定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
如您所知,这都是关于序列化和淡化对象的。假设有一个对象:
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;
}
除了其他答案之外,如果在没有无参数构造函数的类中使用@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:第一
除了上面所有的答案之外,不要忘记文档中说
标记注释,可用于将非静态方法定义为
"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。