【发布时间】:2016-12-09 04:41:50
【问题描述】:
@JsonIgnore
@Xmltransient
private int id
我想通过一些示例来了解在某些属性/字段@JsonIgnore 和@Xmltransient 之上使用这两个注释的目的。
我已经浏览了不同的网站。
【问题讨论】:
-
当你浏览不同的网站时,你发现了什么?
@JsonIgnore
@Xmltransient
private int id
我想通过一些示例来了解在某些属性/字段@JsonIgnore 和@Xmltransient 之上使用这两个注释的目的。
我已经浏览了不同的网站。
【问题讨论】:
@XmlTransient 是一个 JAXB 注释,指示编组器忽略字段/属性。@JsonIgnore 是 Jackson 的专有注解,用于指示 Jackson 忽略字段/属性。由于问题询问@JsonIgnore,我假设您正在寻找Jackson 如何使用它们。使用哪个注解取决于您在 ObjectMapper 中使用的 AnnotationIntrospector。
@XmlTransient 被 JaxbAnnotationIntrospector 读取,它试图在编组到 json 期间遵守 JAXB 注释。@JsonIgnore 由 JacksonAnnotationIntrospector 读取,后者读取标准 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; }
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"
}
【讨论】: