JsonIgnore on Field vs JsonIgnore on Jackson 的 getter

问题描述 投票:0回答:3

杰克逊场上的

JsonIgnore
与吸气剂场上的
JsonIgnore
有什么区别?

java java-8 jackson jackson2
3个回答
7
投票

@JsonIgnore
注解用于忽略反序列化和序列化中的字段,它可以直接放在实例成员或其getter或setter上。在这三点中的任何一点中应用注释都会导致从序列化和反序列化过程中完全排除该属性(这从 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.

的注释仅从反序列化中排除属性

1
投票

据我所知,两者没有区别。

@JsonIgnore
JavaDocs 似乎也使用了可以互换放置的各个位置。

如果您拥有不产生副作用的吸气剂,并且无论出于何种原因希望最终将 lombok 之类的东西合并到您的项目中,那么如果您将

@JsonIgnore
放在字段上,那么转换起来会容易得多。此外,IMO,将这种反/序列化信息放在定义参数的同一位置(即字段本身)会更清晰。


0
投票

@JsonIgnore 对 getter 或字段具有相同的效果,但您可以将其与 @JsonPropertie 混合使用,以更精确地管理序列化/反序列化。

@JsonIgnore
public String getPassword() {
    return password;
}
@JsonProperty
public void setPassword(String password) {
    this.password = password;
}

在该示例中,password未序列化,但您可以将其反序列化。所以你不能读,但你可以写这个属性。

© www.soinside.com 2019 - 2024. All rights reserved.