我一直在尝试使用 Jackson 2.2.2 作为 Json(反)序列化器,在工作的 Spring MVC 3.1.2 应用程序之上开发一个 RESTful 层。问题是,它对引用的了解太深了,以前加载最多需要 1 秒的页面现在只需要服务器端 22 秒。
问题是 Jackson 正在遍历每一个关联,并且需要很长时间才能加载所有内容并解析它。
我知道@JsonIgnore
,但是,我宁愿有深度限制,因为如果我们有这样的说法:
如果我将 @JsonIgnore
放在 B 和 C 之间的链接上,那么序列化 A 时效果会很好,但是如果我需要序列化 B 并希望 C 也序列化怎么办?我能想到的最好的方法是给序列化器一个深度限制。比方说,深度限制= 1,那么在序列化A时它不会序列化C,但在序列化B时仍然会序列化它。有什么办法可以做到这一点吗?
我已经看到了 @JsonView
注释,但它的设计目的是包含属性而不是排除它们。它可用于排除某些属性,但仅在一类级别上相关。
我需要编写自己的序列化程序吗?如果我编写自己的序列化器,有没有办法实现这样的事情?
我不认为这是不可解决的,但我找不到任何对我的情况有帮助的东西......
谢谢!
最佳答案
如果您使用 Hibernate
,Jackson Hibernate 模块 ( https://github.com/FasterXML/jackson-datatype-hibernate ) 支持禁用“延迟”属性(延迟获取的集合)的加载。这将允许您限制要访问和序列化的对象图的大小。
除此之外, jackson 没有基于深度的限制;核心包对特定的域/数据模块一无所知。可以编写扩展模块来改变特定域的行为;这就是 Hibernate 模块的工作原理。也许这可用于通用的 JPA 特定功能。
关于performance - Jackson 2 : Parsing a ton of classes through JPA associations, 是否可以限制深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143195/