As chaves JSON precisam estar entre aspas?


235

Exemplo: O código a seguir é válido com relação à Especificação JSON ?

{
    precision: "zip"
}

Ou devo sempre usar a seguinte sintaxe? (E se sim, por quê?)

{
    "precision": "zip"
}

Eu realmente não encontrei algo sobre isso nas especificações JSON. Embora eles usem aspas em torno de suas chaves em seus exemplos.

Respostas:


147

Sim, você precisa de aspas. Isso é para simplificar e evitar a necessidade de outro método de escape para palavras-chave reservadas em javascript, ou seja {for:"foo"}.


12
As aspas não são mais simples em muitas situações, como arquivos de configuração editados manualmente. O lamentável sobre o JSON ser usado (e mal utilizado) como um formato de intercâmbio quase universal é que ele possui recursos específicos para Javascript.
miguel

12
Verdadeira razão - verifique esta resposta também - stackoverflow.com/questions/4201441/...
TechMaze

3
Tl; dr: eles não queriam lidar com a limitação do ECMAScript em palavras-chave reservadas (sem aspas) como chaves, portanto, apenas exigiam citar todas as chaves.
precisa

136

Você está correto ao usar seqüências de caracteres como a chave. Aqui está um trecho da RFC 4627 - O tipo de mídia application / json para JavaScript Object Notation (JSON)

2.2 Objetos

Uma estrutura de objeto é representada como um par de colchetes envolvendo zero ou mais pares de nome / valor (ou membros). Um nome é uma string . Um único dois pontos vem após cada nome, separando o nome do valor. Uma única vírgula separa um valor do seguinte nome. Os nomes dentro de um objeto devem ser únicos.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5 Cordas

A representação de strings é semelhante às convenções usadas na família C de linguagens de programação. Uma sequência começa e termina com aspas. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Leia toda a RFC aqui .


11
E para terminar o pensamento, secção 2.5 diz: A string begins and ends with quotation marks..
rakslice

13

De 2.2. Objetos

Uma estrutura de objeto é representada como um par de colchetes envolvendo zero ou mais pares de nome / valor (ou membros). Um nome é uma string.

e de 2,5. Cordas

Uma sequência começa e termina com aspas.

Então, eu diria que, de acordo com o padrão: sim, você deve sempre citar a chave (embora alguns analisadores possam perdoar mais)


7

Sim, as cotações são obrigatórias. http://json.org/ diz:

string
    ""
    " chars "

0

Sim, eles fazem. Mas se você precisar de outra forma, faça o checkout JSON5 .

JSON5 é um superconjunto de JSON que permite a sintaxe do ES5, incluindo:

  • chaves de propriedade não citadas
  • strings de aspas simples e de múltiplas linhas
  • formatos de números alternativos
  • comentários
  • espaço em branco extra

A implementação de referência JSON5 ( json5pacote npm ) fornece um JSON5objeto que possui parsee stringifymétodos com os mesmos argumentos e semânticas que o JSONobjeto interno .


-2

Como você pode colocar a notação pontilhada "parent.child" e não precisar colocar parent ["child"], que também é válido e útil, eu diria que ambas as formas são tecnicamente aceitáveis. Todos os analisadores devem fazer os dois lados muito bem. Se o seu analisador não precisar de aspas nas teclas, provavelmente é melhor não colocá-las (economiza espaço). Faz sentido chamá-las de strings, porque é isso que elas são, e como os colchetes oferecem a capacidade de usar valores para chaves, essencialmente faz todo o sentido não usar. Em Json você pode colocar ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

muito bem, sem problemas, se você precisar de um valor para uma chave e nenhum citado não funcionar, por isso, se não funcionar, você não poderá, portanto, não precisará "não precisa de aspas nas chaves". Mesmo que seja certo dizer que são tecnicamente cordas. A lógica e o uso argumentam o contrário. Nem produz oficialmente o Objeto {"someKey": "someValue"} para obj em nosso exemplo, executado no console de qualquer navegador.


2
Tanto a resposta aceita quanto a RFC que define o JSON dizem que as aspas são necessárias.
Keith Thompson

Isso é verdade, mas vale a pena notar que logicamente não é necessário. Suponho que uma saída de JavaScript Object Notation de todos os consoles do navegador esteja errada, e devemos dizer a alguém para corrigir isso. Talvez o que o console do navegador produz para um objeto não seja JSON, portanto, talvez o JSON, conforme definido pelas especificações, não seja necessário nem implementado dessa maneira na maioria dos lugares. Enfim, eu só queria defender o caso, que olha os fatos sob uma luz diferente. Realmente, talvez a especificação deva ser alterada, em seguida, "Quoted Keys" simplesmente não é necessário em qualquer lugar que seja importante para mim pessoalmente. (Não é apenas usado dessa maneira na prática.)
Mestre James

2
Você está misturando três coisas diferentes: JSON, literais de objeto JavaScript e saída do console das ferramentas do desenvolvedor do navegador. Quando você digita seu objno console, o navegador exibe alguma representação legível por humanos do objeto. Pode exibi-lo como um objeto literal (como no seu exemplo), ou pode usar alguma outra representação, até mesmo interativa. Literais de objeto JavaScript não requerem aspas em torno de um nome de chave se a chave for um identificador válido e não uma palavra reservada. No entanto, o JSON sempre exige aspas em torno dos nomes das chaves.
Michael Geary

3
Como exemplos adicionais, em vez de digitar objno console, tente JSON.stringify(obj). Agora você verá uma representação JSON válida do objeto, completa com o nome da chave entre aspas. Por outro lado, para verificar se uma sequência é JSON válida, tente JSON.parse(string). Se as chaves não forem citadas, isso gerará uma exceção. Por exemplo, JSON.parse('{"a":"b"}')terá sucesso, mas JSON.parse('{a:"b"}')falhará.
Michael Geary

1
OTOH, seu uso var obj = {[keyName]:"someValue"};é muito interessante! Eu não sabia que você poderia fazer isso em um literal de objeto JavaScript. Um pouco de verificação mostra que isso é algo novo no ES6 - você não poderia fazê-lo no ES5.
Michael Geary
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.