Java 与Jackson/Gson的良好休息设计

Java 与Jackson/Gson的良好休息设计,java,json,rest,backbone.js,jackson,Java,Json,Rest,Backbone.js,Jackson,我已经使用Jackson开发了几年了,但总有一些事情困扰着我: 我在服务器上的模型相互关联。例如: Lock有一个Person,其中有一个LogEntry列表,每个LogEntry都有一个Lock。 为了获得一个锁,我调用/api/lock/id,我还将检索人员和日志条目,但是LogEntry引用lock,因此它将成为一个无限循环 在设计模型时,有没有好的方法/标准可以遵循?也许应该只返回引用的ID 我希望避免循环引用(这在许多情况下对于注释是不可能的),但我也希望避免编写序列化程序 你还有其他

我已经使用Jackson开发了几年了,但总有一些事情困扰着我:

我在服务器上的模型相互关联。例如:
Lock
有一个
Person
,其中有一个
LogEntry
列表,每个
LogEntry
都有一个
Lock
。 为了获得一个锁,我调用
/api/lock/id
,我还将检索人员和日志条目,但是
LogEntry
引用
lock
,因此它将成为一个无限循环

在设计模型时,有没有好的方法/标准可以遵循?也许应该只返回引用的ID

我希望避免循环引用(这在许多情况下对于注释是不可能的),但我也希望避免编写序列化程序


你还有其他建议吗?(仅供参考:我最常在客户端使用主干网)

您有两种选择。一种是只返回相关项的链接,而不是嵌入整个资源。如果需要,可以支持一个查询参数
?expand=
,它告诉服务器嵌入整个资源。另一个选项是创建一个单独的资源来管理关系,例如/log条目锁,它可能看起来像

GET /log-entry-locks?log-entry=15
[{
    "id": 1345,
    "log-entry": "/log-entries/15",
    "lock": "/locks/22"
},
{
    "id": 1346,
    "log-entry": "/log-entries/15",
    "lock": "/locks/46"
}]

我喜欢你演示的第二个选项。我想我会尝试一下,看看它是如何与主干。谢谢!您还有其他解决方案,例如JSON-LD,任何其他RDF格式都可以描述图形。或者通过多次调用,您的客户端可以记住已经检索到的资源的URL,因此不会再次调用它们…只需提及,通过REST跟踪超链接不是一个选项,您的客户端应该始终使用由服务构建的超链接来发送请求。(又名统一接口/HATEOAS约束)@inf3rno您能详细说明一下,或者举个例子吗?我查阅了JSON-LD,但没有完全理解它的含义。它将RDF词汇表绑定到服务器发送给客户端的数据。因此,客户可以了解数据的具体部分。我猜目前您的客户机解析JSON,但不知道属性的语义。因此,它使用属性名而不是语义来获取数据。通过JSON-LD,您可以通过定义@context向属性名称添加语义。因此,您的客户机可以使用语义来查找正确的属性,而不是总是可以更改的属性名称。链接也是一样的,你也必须给它们添加语义。