Another alternative (using HATEOAS). This is simple, mostly in practice you add a links tag in the json depending on your use of HATEOAS.
http://api.example.com/games/1:
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": [
{"_self": "http://api.example.com/games/1/platforms/53", "name": "Playstation"},
{"_self": "http://api.example.com/games/1/platforms/34", "name": "Xbox"},
]
}
http://api.example.com/games/1/platforms/34:
{
"id": 34,
"title": "Xbox",
"publisher": "Microsoft",
"releaseDate": "2015-01-01",
"testReport": "http://api.example.com/games/1/platforms/34/reports/84848.pdf",
"forms": [
{"type": "edit", "fields"fields": [] ...},
]
}
You can off course embed all data in all listing but that will likely be way too much data. This way you can embed the required data and then load more if you really want to work with it.
The technical implementation can contain caching. You can cache the platforms links and names in the game object and send it instantly without having to load the platforms api at all. Then when required you can load it.
You see for example that I added some form information. I did that to show you there can be much more information in a detailed json object than you would even want to load in the listing of games.