当涉及JSON API时,将响应展平并避免嵌套JSON对象是一种好习惯吗?
例如,假设我们有一个类似于IMDb的API,但用于视频游戏。有几个实体,分别是Game,Platform,ESRBRating和GamePlatformMap,它们映射了Game和Platform。
假设您请求/ game / 1来获取ID为1的游戏,并返回嵌套了平台和esrbRating的游戏对象。
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": [
{"id":1,"name":"Xbox"},
{"id":2,"name":"Playstation"}
],
"esrbRating": {
"id": 1,
"code": "E",
"name": "Everyone"
}
}
如果您使用的是JPA / Hibernate之类的工具,并且将其设置为FETCH.EAGER,它可能会自动为您执行此操作。
另一个选择是简单地使用API并添加更多端点。
在这种情况下,当请求/ game / 1时,仅返回游戏对象。
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
如果需要平台和/或ESRBRating,则必须调用以下命令:
/ game / 1 /平台/ game / 1 / esrb
这种方法似乎可能会根据客户端需要什么数据以及何时需要它们而向服务器添加多个调用。
最后有一个想法,我曾在这里遇到过类似的问题。
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
但是,这假设他们不需要ID或与这些平台对象关联的任何其他信息。
我通常会问,构造从API返回的JSON对象的最佳方法是什么。您是否应该尝试尽可能靠近实体,还是使用域对象或数据传输对象很好?我知道这些方法会有所取舍,要么在数据访问层上进行更多工作,要么为客户端进行更多工作。
我还想听到一个与使用Spring MVC作为API的后端技术有关的答案,可以使用JPA / Hibernate或MyBatis进行持久化。