2013-04-12 175 views
3
杰克逊/ JPA

使用杰克逊

  1. 问题有关组合序列化JPA实体JSON如果在当前的应用程序约20单位和我加入POM杰克逊依赖,是否意味着所有的实体都默认准备转换为JSON对象?我看到一个示例项目似乎只有课程注释为@JsonIgnored被跳过JSON。如果是这样,那么怎么会发生这种机制呢? JACKSON如何处理那些没有任何Jackson注解的实体,默认情况下被忽略或不被忽略?我一直在网上寻找资源,但没有多少运气。

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

谢谢。

+0

“实体”在您的环境中意味着什么?这是一堂课吗?一个班级的领域?方法?如果你含糊不清,不能帮你... –

+0

@pgelinas它是一个类,就像JPA实体类一样。 – Dreamer

回答

12

杰克逊和JPA没有什么做对方。 Jackson是一个JSON解析库,JPA是一个持久性框架。杰克逊可以序列几乎任何对象 - 唯一的要求是该对象具有某种与@JsonProperty注释识别的属性(Javabean type properties,或裸字段没有为反序列化一个额外要求,即目标类型。有一个默认(无参数)构造函数,因此,举例来说,这是一个对象,杰克逊可以序列:

// 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实体类 - 就杰克逊而言它可以被序列化就像任何其他类型。 但是,注意它的字段:当这个对象被序列化成JSON时,两个字段将不会被包含 - 'password'和'address'。这是因为它们已被注释为@JsonIgnore@JsonIgnore批注允许开发者说'嘿,它可以序列化这个对象,但是当你这样做的时候不要在输出中包含这些字段'。此排除仅出现在此对象的字段中,因此,例如,如果您在另一个类中包含Address字段,但未将该字段标记为可忽略,则会将其序列化。

为了防止类型的序列在所有情况下,不管上下文,使用@JsonIgnoreType注解。当用于一个类型时,它基本上意味着'我不在乎使用这种类型的地方,从来没有序列化它'。

+0

非常好的解释。谢谢。剩下的一个问题是,即使没有显式声明(如果不使用'@ JsonIgnore'和'@ JsonIgnoreType'),'JACKSON'是否会默认自动将所有JPA实体转换为'JSON'对象?如果是这样,那是否是一种重新发展?我知道所有的JPA实体即使没有JACKSON也都是可序列化的,但这是否意味着将所有实体转换为'JSON'对象是没有额外成本的? – Dreamer

+2

在您调用序列化之前,Jackson不会执行任何操作,例如通过调用'new ObjectMapper()。writeValueToString(new Person();'。在这种情况下,'Person'对象将被写为JSON,它指的是(作为类变量),因为它将这些对象写成JSON,它会忽略用@JsonIgnore注释的字段,或者用@ JsonIgnoreType注释的类型,这些都是规则,Jackson没有说'哦,这个包中的50个类,可以将它们转换为JSON以达到它的目的。希望这可以清除一些东西 – Perception

+0

所以JACKSON不会一次将它们全部转换,而是一个Entity说ClassNoJSON(例如)那么ObjectMapper开始工作了吗?总之,开发人员应该小心并且应该在不必要的实体或字段上放置'@ JsonIgnoreType'或'@ JsonIgnore'以获得更好的性能?我只是试图清楚我正在添加JSON特性以实体为基础,但不以牺牲成本为代价为所有实体增加额外成本。 – Dreamer

1

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

杰克逊的文档很容易在网上找到,例如在其项目页面github或codehaus website

+0

'杰克逊只会处理你给它的物品,这不是什么魔法。'如何给予'你可以更具体吗?感谢您的链接,但我没有找到太多关于JPA /杰克逊'JACKSON DOCUMENTATION' – Dreamer

+0

嗯,那么你的问题是什么?如何配置JPA(hibernate?)以使用Jackson进行序列化? –

+0

是的,问题更多的是如何在JPA上配置'Jackson',但是我的困惑确实是关于'JACKSON'如何处理那些没有任何Jackson注解的实体,默认情况下被忽略或者不被忽略? – Dreamer