With full metadata in the JSON format, all control information (ids, read/edit links, navigation links, media links, etc.) are returned in the payload.
In the JSON minimal metadata format, only that control information that cannot be derived from the context (i.e., contextUrl and associated metadata) is returned.
In the JSON no metadata format, no control information (other than nextLink and explicitly requested deltalink) is returned.
There may be scenarios where the client explicitly wants ids, but does not want additional control information. There is no way to request such a response in JSON today.
A JSON-specific solution would perhaps be to define a new metadata-level, such as application/json;odata.metadata=id.
If we believe that other formats may have similar payload optimizations, we could define a special value used in $select (such as @id) to explicitly request (in any format) that the id be present, similar to how we use $select to include navigation links. Note that services can always include the id, and in some formats may always have an id, but the syntax would enable a common way to request id across formats.