杰克逊和 JPA 没有任何关系。Jackson 是一个 JSON 解析库,而 JPA 是一个持久性框架。Jackson 几乎可以序列化 任何对象 - 唯一的要求是该对象具有某种可识别的属性(Javabean 类型属性或用 注释的裸字段。反序列@JsonProperty
化还有一个额外要求,即目标类型具有默认值(无参数) 构造函数。因此,例如,这是 Jackson 可以序列化的对象:
// Class with a single Javabean property, "name"
class Person {
private String name;
public String getName() { return name ; }
public String setName(String name) { this.name = name ; }
}
这是另一个:
// Class with a single field annotated with @JsonProperty
class Account {
@JsonProperty("accountNumber")
private String accountNumber;
}
这是另一个:
@Entity
public class User {
@Id
private Long id;
@Basic
private String userName;
@Basic
@JsonIgnore
private String password;
@Basic
@JsonIgnore
private Address address;
// Constructors, getters, setters
}
最后一个示例显示了一个 JPA 实体类——就 Jackson 而言,它可以像任何其他类型一样被序列化。但是,请注意它的字段:当此对象被序列化为 JSON 时,其中两个字段将不包括在内 - “密码”和“地址”。这是因为它们已经被注释了@JsonIgnore
。注释允许开发人员说“@JsonIgnore
嘿,可以序列化这个对象,但是当你这样做时,不要在输出中包含这些字段”。此排除仅针对此对象的字段发生,因此,例如,如果您Address
在另一个类中包含了一个字段,但没有将该字段标记为可忽略,它将被序列化。
为了防止在所有情况下对类型进行序列化,无论上下文如何,请使用@JsonIgnoreType
注释。当用于类型时,它基本上意味着“我不在乎这种类型在哪里使用,从不序列化它”。