Cuando se trata de API JSON, ¿es una buena práctica aplanar las respuestas y evitar objetos JSON anidados?
Como ejemplo, digamos que tenemos una API similar a IMDb pero para videojuegos. Hay un par de entidades, Juego, Plataforma, ESRBRating y GamePlatformMap que mapean Juegos y Plataformas.
Digamos que solicitas / game / 1 que obtiene el juego con ID 1 y devuelve el objeto del juego con las plataformas y esrbRating anidado.
{
"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"
}
}
Si está utilizando algo como JPA / Hibernate, puede hacerlo automáticamente si está configurado en FETCH.EAGER.
La otra opción es simplemente la API y agregar más puntos finales.
En ese caso, cuando se solicita / game / 1 solo se devuelve el objeto del juego.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Si desea que las plataformas y / o ESRBRating tengan que llamar a lo siguiente:
/ juego / 1 / plataforma / juego / 1 / esrb
Parece que este método podría agregar varias llamadas más al servidor dependiendo de qué datos necesita el cliente y cuándo lo necesitan.
Hubo un último pensamiento que tuve donde tendrías que devolver algo como esto.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
Sin embargo, esto supone que no necesitan los ID o cualquier otra información que pueda estar asociada con esos objetos de la plataforma.
En general, pregunto cuál es la mejor manera de estructurar sus objetos JSON devueltos por su API. ¿Debería tratar de mantenerse lo más cerca posible de sus entidades, o está bien usar Objetos de dominio u Objetos de transferencia de datos? Entiendo que los métodos tendrán compensaciones, ya sea más trabajo en la capa de acceso a datos o más trabajo para el cliente.
También me gustaría escuchar una respuesta relacionada con el uso de Spring MVC como tecnología de back-end para la API, ya sea con JPA / Hibernate o MyBatis para la persistencia.