Extensions like .html and .json etc. can be useful for debugging in the browser as the user (client developer) can get different media types returned by playing with the URLs only.
With a hypermedia API it becomes "odd" (in lack of better terms) to have different URLs for the same resource - you would need one link relation type for each content type representation of the linked resource or use a format that allows the media type to be included in the link.
Example: assume the link relation "up" refers to some parent resource P. This resource P can be represented in either JSON or XML. Without media types in links you would need this:
<link rel="up-json" href=".../parent.json"/>
<link rel="up-xml" href=".../parent.xml"/>
... which in turn means you cannot use a single link relation like "up".
If the link definition include media type (and ATOM for instance does that) you could write:
<link rel="up" type="json" href=".../parent.json"/>
<link rel="up" type="xml" href=".../parent.xml"/>
... and now you can have your single link relation and let the client decide which content type it wants.
If you depend on content negotiation instead you could reduced all this to:
<link rel="up" href=".../parent"/>
... which seems more elegant, but does not inform the client of the possible content type variantions, so you would still need two links to inform the client completely about available representations:
<link rel="up" type="json" href=".../parent"/>
<link rel="up" type="xml" href=".../parent"/>
If you are not using hypermedia then none of this matters and content negotiation vs. URL extensions is an irrelevant discussion - both solutions work well (but adding .json or .xml does make it easier to debug as mentioned earlier).
You can although start a more philosophical discussion about the same resource having different URLs (.xml and .json) when URL = identifier ... but in the end a resource is allowed to have multiple URLs although one of them should be considered "canonical".
/Jørn