【发布时间】:2009-04-08 21:43:36
【问题描述】:
我正在开发一个 RESTful Web 服务。
我有一堆实体类(主要是 JPA 实体,还有其他 bean)。
有大量的对象映射、序列化、绑定和诸如此类的库。我正在寻找一种能够让我:
-
将实体序列化为 XML 和 JSON
序列化必须支持使用 getters,而不仅仅是对象字段。
它必须支持视图。视图是指一种指定要序列化的实体属性子集的方法。例如,请参阅 Yahoo! 中的 Retrieving Partial Resources。社交平台 API。我也不希望它无限深地递归:
视图应该定义 a) 要在实体中公开的属性和 b) 每个属性的视图(如果它们本身就是实体)。
例如,实体
Person可能具有视图full和simple。当请求Person的simple视图时,只会序列化属性id、firstName和lastName。当请求full视图时,属性mother和father(它们本身就是Persons)也将被序列化,但仅限于simple视图(因此它不会递归到祖父母)。JSON 序列化必须是“自然”,即在 Javascript 中有意义的内容。这意味着我想要正确的整数、布尔值和空值,并且我不想要额外的对象包装器或试图捕获整个 XML 信息集的东西。
对于 XML,必须可以将序列化配置为使用 空元素 序列化空值,而不是 XML Schema 的
xsi:nil="true"属性。此外,数组必须使用嵌套元素进行序列化,以便区分空数组和给定视图中不存在的属性:
-
未定义的
friends属性(视图中不存在):<person> </person> -
空数组,人没有朋友:
<person> <friends></friends> </person>
-
-
反序列化 XML 和 JSON 并将数据合并到现有实体中
现在这是困难的部分。接下来的两个是连接的:
部分对象的反序列化必须是可能的(类似于视图,但没有预先定义哪些属性存在)。
合并到现有属性,而不是创建新属性。
这有点难以解释。大多数库都反序列化为 Java 对象,但在那个时候,未定义属性和空/空属性之间的区别(因为它存在于 Javascript/JSON、如上所述的 XML、PHP 等)之间的区别就消失了。
当得到这个 XML 时:
<person> <lastName>Bon Jovi</lastName> <friends></friends> </person>并且被传递一个
Person对象,库应该:person.setLastName("Bon Jovi"); person.setFriends(new ArrayList());它不应触及实体
firstName和/或清除它是father,例如。当然,对于列表,这应该更复杂。我希望配置一个 id 属性,通过它来决定是更新嵌套实体还是创建一个新实体。
这些更新/补丁是库不能只返回 DTO 的一个原因:因为那时
null可能意味着“未设置”或“什么都不做”。
嗯,就是这样。我一直在说“必须”很多,我现在意识到 :) 库实际上不需要提供它,但必须有一种方法以一种干净的方式添加功能(= 不是以一种会重写所有内容的方式更容易)。
【问题讨论】:
标签: java xml json serialization