使用Jackson将JPA实体序列化为JSON

时间:2013-04-12 15:30:12

标签: json java-ee jpa ejb jackson

有关Jackson / JPA组合的问题

  1. 如果当前应用程序中有大约20个实体,并且我在POM中添加了Jackson依赖项,是否意味着默认情况下所有实体都已准备好转换为JSON对象?我看到一个示例项目似乎只有@JsonIgnoredJSON跳过的类注释。如果是这样,那怎么会发生这种机制背后的原因呢? JACKSON如何处理那些没有任何Jackson注释的实体,默认情况下是否被忽略?我一直在网上寻找资源,但运气不好。

  2. 如果20个实体中只有一个需要映射到JSON对象,是否意味着我必须将@JsonIgnore添加到所有其他19个实体?如果没有,Jackson如何与实体区分开来?

  3. 感谢。

2 个答案:

答案 0 :(得分:13)

杰克逊和JPA彼此没有任何关系。 Jackson是一个JSON解析库,JPA是一个持久性框架。杰克逊可以序列化 几乎所有 对象 - 唯一的要求是该对象具有某种可识别的属性(Javabean type properties或裸露用@JsonProperty注释的字段。反序列化还有一个要求,即目标类型有一个默认的(无参数)构造函数。例如,这是杰克逊可以使用的对象序列:

// 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注释。当在一个类型上使用它基本上意味着'我不在乎这种类型的使用位置,从不序列化'。

答案 1 :(得分:1)

不,你不需要在每个类上添加@JsonIgnore,如果你曾经尝试过,你会遇到编译错误,因为你不能把它放在那里。杰克逊只会处理你给它的物体,这不是魔术。

Jackson文档很容易在网上找到,例如github上的项目页面或代码库website