@JsonIgnore和@Xmltransient有什么用?

时间:2016-12-09 04:41:50

标签: json spring

@JsonIgnore 
@Xmltransient
private int id

我想了解在某些属性/字段@JsonIgnore&之上使用这两个注释的目的。 @Xmltransient有一些例子。

我已经浏览过不同的网站。

1 个答案:

答案 0 :(得分:4)

  • @XmlTransient是一个JAXB批注,用于向编组发送信号以忽略字段/属性。
  • @JsonIgnore是Jackson的专有注释,指示Jackson忽略字段/属性。

由于这个问题询问的是@JsonIgnore,所以我假设您正在寻找Jackson如何使用它们。使用哪个注释取决于您与ObjectMapper一起使用哪个AnnotationIntrospector

不带@XmlTransient的示例:

public class User
{
    private String firstName;
    private String lastName;

    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }

    public String getUserName()
    {
        return firstName + "_" + lastName;
    }
}

杰克逊输出示例:

{
    firstName: "Jay", 
    lastName: "Unit", 
    userName: "Jay_Unit"
}

Jackson将userName识别为属性,因为getUserName()看起来像字段访问器。在这种情况下,getUserName()包含用于构造userName属性的业务逻辑,可能需要将其包含在结果json中。但是,如果不需要userName属性,或者将json解组到User类中,则通过网络发送userName是浪费的。您可以使用@XmlTransient或@JsonIgnore阻止Jackson整理字段。

属性为@XmlTransient的示例:

public class User
{
    private String firstName;
    private String lastName;

    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }

    @XmlTransient
    public String getUserName()
    {
        return firstName + "_" + lastName;
    }
}

杰克逊输出示例:

{
    firstName: "Jay", 
    lastName: "Unit"
}

在字段上带有@JsonIgnore的示例:

public class User
{
    @JsonIgnore
    private String firstName;

    @JsonIgnore
    private String lastName;

    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }

    public String getUserName()
    {
        return firstName + "_" + lastName;
    }
}

杰克逊输出示例:

{
    userName: "Jay_Unit" 
}