5

关于 Jackson/JPA 组合的问题

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

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

谢谢。

4

2 回答 2

15

杰克逊和 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注释。当用于类型时,它基本上意味着“我不在乎这种类型在哪里使用,从不序列化它”。

于 2013-04-12T19:21:36.640 回答
1

不,你不需要添加@JsonIgnore每个类,如果你尝试过,你会得到一个编译错误,因为你不能把它放在那里。杰克逊只会在你给它的东西上工作,这不是魔法。

Jackson 文档很容易在网上找到,例如在github上的项目页面或 codehaus网站上

于 2013-04-12T18:12:22.007 回答