O verdadeiro motivo pelo qual as chaves JSON devem estar entre aspas é a semântica dos Identificadores do ECMAScript 3.
Palavras reservadas não podem ser usadas como nomes de propriedade em literais de objeto sem aspas, por exemplo:
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
Se você usar aspas, os nomes das propriedades serão válidos:
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
O próprio Crockford explica isso nesta palestra , eles queriam manter o padrão JSON simples e não gostariam de ter todas essas restrições semânticas nele:
....
Foi quando descobrimos o problema do nome não citado. Acontece que o ECMA Script 3 tem uma política de palavras reservadas do tipo whack. As palavras reservadas devem ser citadas na posição chave, o que é realmente um incômodo. Quando comecei a formular isso em um padrão, não queria ter que colocar todas as palavras reservadas no padrão, porque pareceria muito estúpido.
Na época, eu estava tentando convencer as pessoas: sim, você pode escrever aplicativos em JavaScript, na verdade vai funcionar e é uma boa linguagem. Eu não quis dizer, então, ao mesmo tempo: e olhe só que bobagem eles fizeram! Então decidi, em vez disso, vamos apenas citar as chaves.
Dessa forma, não precisamos contar a ninguém sobre o quão maluco é.
É por isso que, até hoje, as chaves são citadas em JSON.
...
O ECMAScript 5th Edition Standard corrige isso, agora em uma implementação ES5, mesmo palavras reservadas podem ser usadas sem aspas, em ambos, literais de objeto e acesso de membro ( obj.function
Ok em ES5).
Apenas para registro, este padrão está sendo implementado atualmente por fornecedores de software. Você pode ver quais navegadores incluem esse recurso nesta tabela de compatibilidade (consulte Palavras reservadas como nomes de propriedade )