JsonIgnore on Field vs JsonIgnore on getter of a field in Jackson

Posted

技术标签:

【中文标题】JsonIgnore on Field vs JsonIgnore on getter of a field in Jackson【英文标题】: 【发布时间】:2018-12-31 09:37:42 【问题描述】:

JsonIgnore on Field 与 JsonIgnore on a getter in Jackson 有什么区别?

【问题讨论】:

把它放在字段上相当于分别注释getter和setter。 如果我没有该字段的 getter 和 setter 怎么办? 那么您不必担心对 getter 进行注释,对吗? 我认为 Jackson 会寻找 getter 和 Setter 来寻找反序列化/序列化的字段,如果我们没有它们,它仍然会进行反序列化/序列化操作吗? 【参考方案1】:

@JsonIgnore 注解用于忽略反序列化和序列化的字段,它可以直接放在实例成员或其getter或setter上。在这 3 点中的任何一点中应用注释都会导致从序列化和反序列化过程中完全排除该属性(这适用​​于从 Jackson 1.9 开始;这些示例中使用的版本是 Jackson 2.4.3) .

注意: 在 1.9 版之前,此注解仅在逐个方法(或逐个字段)的基础上工作;一个方法或字段的注释并不意味着忽略其他方法或字段

例子

 import java.io.IOException;

 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;

 class MyTestClass 

 private long id;
 private String name;
 private String notInterstingMember;
 private int anotherMember;
 private int forgetThisField;

 public long getId() 
    return this.id;
 

 public void setId(long id) 
     this.id = id;
 

 public String getName() 
     return this.name;
 

 public void setName(String name) 
    this.name = name;
 

 @JsonIgnore
 public String getNotInterstingMember() 
    return this.notInterstingMember;
 

 public void setNotInterstingMember(String notInterstingMember) 
    this.notInterstingMember = notInterstingMember;
 

 public int getAnotherMember() 
    return this.anotherMember;
 

 public void setAnotherMember(int anotherMember) 
    this.anotherMember = anotherMember;
 

 public int getForgetThisField() 
    return this.forgetThisField;
 

 @JsonIgnore
 public void setForgetThisField(int forgetThisField) 
    this.forgetThisField = forgetThisField;
 

 @Override
 public String toString() 
    return "MyTestClass [" + this.id + " , " +  this.name + ", " + this.notInterstingMember + ", " + this.anotherMember + ", " + this.forgetThisField + "]";
    

  

输出:

 "id":1,"name":"Test program","anotherMember":100
 MyTestClass [1 , Test program, null, 100, 0]

但仍然可以更改此行为并使其不对称,例如使用 @JsonIgnore 注释和另一个名为 @JsonProperty. 的注释仅从反序列化中排除属性

【讨论】:

【参考方案2】:

据我所知,两者没有区别。 @JsonIgnore JavaDocs 似乎使用了您可以互换放置的各个地方。

但是,如果您的 getter 不会产生副作用,并且出于某种原因希望最终将类似 lombok 的东西合并到您的项目中,那么如果您将 @JsonIgnore 放在字段上,则进行切换会容易得多。另外,IMO,将这种反序列化信息放在定义参数的地方,即字段本身,会更清晰。

【讨论】:

以上是关于JsonIgnore on Field vs JsonIgnore on getter of a field in Jackson的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails,json vs js ajax 响应

Node.js vs Ruby on Rails:哪个最适合Web开发?

json 中如何使用@JsonIgnore?

#yyds干货盘点#jackson学习之七:常用Field注解

MYSQL ( field1, field2 ) = (x,y) vs field1= x AND field2 = Y 的区别

rails f.number_field vs number_field_tag