A especificação JSON diz que JSON é um objeto ou uma matriz. No caso de um objeto,
Uma estrutura de objeto é representada como um par de chaves em torno de zero ou mais pares de nome / valor (ou membros). Um nome é uma string. ...
E mais tarde, a especificação diz que uma string está entre aspas.
Por quê?
Portanto,
{"Property1":"Value1","Property2":18}
e não
{Property1:"Value1",Property2:18}
Pergunta 1 : por que não permitir que o nome nos pares nome / valor sejam identificadores não citados?
Questão 2 : Existe diferença semântica entre as duas representações acima, quando avaliadas em Javascript?
javascript
json
Cheeso
fonte
fonte
eval()
(isto é, javascript).Respostas:
A filosofia de design do JSON é "Keep it simple"
"Citar nomes com
"
" é muito mais simples do que "Você pode citar nomes com"
ou'
mas não precisa, a menos que contenham certos caracteres (ou combinações de caracteres que tornariam uma palavra-chave) e /'
ou"
talvez precisem ser citados, dependendo em qual delimitador você selecionou " .Não. Em JavaScript, eles são idênticos.
fonte
JSON.parse
função:JSON.parse('{"a":1}')
funciona bem , por queJSON.parse('{a:1}')
gerará uma exceção .JSON.parse
é um analisador JSON implementado em JavaScript, não é um analisador JavaScript.Deixo uma citação de uma apresentação que Douglas Crockford (o criador do padrão JSON) fez ao Yahoo.
Ele fala sobre como descobriu o JSON e, entre outras coisas, por que decidiu usar as chaves citadas :
Você pode encontrar o vídeo completo e a transcrição aqui .
fonte
{ a }
onde a propriedade 'a' copia o valor de uma variável global ou local 'a'.{[key]: value}
Ambos
:
e espaços em branco são permitidos em identificadores. Sem as aspas, isso causaria ambiguidade ao tentar determinar o que exatamente constitui o identificador.fonte
Em javascript, os objetos podem ser usados como um hash / hashtable com pares de chaves.
No entanto, se sua chave tiver caracteres que o javascript não pode tokenizar como um nome, ela falhará ao tentar acessar como uma propriedade em um objeto em vez de uma chave.
identificadores às vezes podem ter caracteres que não podem ser avaliados como token / identificador em javascript, portanto, é melhor colocar todos os identificadores em strings para consistência.
fonte
Acho que a resposta certa para a pergunta do Cheeso é que a implementação superou a documentação. Não requer mais uma string como chave, mas algo mais, que pode ser uma string (ou seja, entre aspas) ou (provavelmente) qualquer coisa que possa ser usada como um nome de variável, o que suponho que significa começar com uma letra _ , ou $, e inclui apenas letras, números e $ e _.
Eu queria simplificar o resto para a próxima pessoa que fizer essa pergunta com a mesma ideia que eu. Aqui está a carne:
Os nomes das variáveis não são interpolados em JSON quando usados como uma chave de objeto (Obrigado, Friedo!)
Breton, usando "identificador" em vez de "chave", escreveu que "se um identificador for uma palavra reservada, será interpretado como essa palavra e não como um identificador". Pode ser verdade, mas tentei sem problemas:
=> 6
Sobre o uso de aspas, Quentin escreveu "... mas você não precisa, a menos que [a chave] contenha certos caracteres (ou combinações de caracteres que a tornariam uma palavra-chave)"
Descobri que a parte anterior (certos caracteres) é verdadeira, usando o sinal @ (na verdade, acho que $ e _ são os únicos caracteres que não causam o erro):
=> Erro de sintaxe
=> 1
mas o parênteses sobre palavras-chave, como mostrei acima, não é verdade.
O que eu queria funciona porque o texto entre a abertura {e os dois-pontos, ou entre a vírgula e os dois-pontos para as propriedades subsequentes é usado como uma string sem aspas para fazer uma chave de objeto ou, como Friedo colocou, um nome de variável não ' para ser interpolado:
=> ABC123
fonte
Se json descreve objetos, então, na prática, você obtém o seguinte
Então,
portanto, mesmo que seus exemplos produzam o mesmo resultado, seus equivalentes em "código bruto" não o farão. Talvez seja por isso ?? não sei, apenas uma ideia.
fonte
{ bar: 'goodbye' }
não definirá o nome da chave com o valor debar
, será apenasbar
. Os outros estão certos sobre o motivo pelo qual a especificação requer aspas: é para evitar conflitos de palavras-chave e caracteres especiais.Pode reduzir o tamanho dos dados se aspas no nome forem permitidas apenas quando necessário
fonte