@JsonIgnore 和 @Xmltransient 有什么用?

mis*_*a88 3 json jaxb jackson

@JsonIgnore 
@Xmltransient
private int id
Run Code Online (Sandbox Code Playgroud)

我想了解使用的一些属性/字段的顶部这两个注释的目的@JsonIgnore@Xmltransient一些示例。

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

mor*_*ost 6

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

由于问题询问的是@JsonIgnore我假设您正在寻找Jackson是如何使用它们的。使用哪个注解取决于AnnotationIntrospector您使用 ObjectMapper 的注解。

没有的示例@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

示例杰克逊输出:

{
    firstName: "Jay", 
    lastName: "Unit", 
    userName: "Jay_Unit"
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

示例杰克逊输出:

{
    firstName: "Jay", 
    lastName: "Unit"
}
Run Code Online (Sandbox Code Playgroud)

带有@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

示例杰克逊输出:

{
    userName: "Jay_Unit" 
}
Run Code Online (Sandbox Code Playgroud)