La verdadera razón por la que las claves JSON deben estar entre comillas se basa en la semántica de Identifiers of ECMAScript 3.
Las palabras reservadas no se pueden utilizar como nombres de propiedad en literales de objeto sin comillas, por ejemplo:
({function: 0})
({if: 0})
({true: 0})
Mientras que si usa comillas, los nombres de las propiedades son válidos:
({"function": 0})
({"if": 0})
({"true": 0})
El propio Crockford lo explica en esta charla , querían mantener simple el estándar JSON, y no les gustaría tener todas esas restricciones semánticas:
....
Fue entonces cuando descubrimos el problema de los nombres sin comillas. Resulta que ECMA Script 3 tiene una política de palabras reservadas. Las palabras reservadas deben citarse en la posición clave, lo que realmente es una molestia. Cuando llegué a formular esto en un estándar, no quería tener que poner todas las palabras reservadas en el estándar, porque se vería realmente estúpido.
En ese momento, estaba tratando de convencer a la gente: sí, puedes escribir aplicaciones en JavaScript, realmente va a funcionar y es un buen lenguaje. No quería decir, entonces, al mismo tiempo: ¡y mira esta cosa realmente estúpida que hicieron! Así que decidí, en cambio, citar las claves.
De esa manera, no tenemos que decirle a nadie qué tan bueno es.
Es por eso que, hasta el día de hoy, las claves se citan en JSON.
...
El estándar ECMAScript 5th Edition corrige esto, ahora en una implementación de ES5, incluso las palabras reservadas se pueden usar sin comillas, tanto en literales de objeto como en acceso de miembros ( obj.function
Ok en ES5).
Solo para que conste, este estándar está siendo implementado en estos días por los proveedores de software, puede ver qué navegadores incluyen esta función en esta tabla de compatibilidad (consulte Palabras reservadas como nombres de propiedad )