Quais caracteres são válidos / inválidos em um nome de chave JSON?

151

Existem caracteres proibidos nos nomes das chaves, para objetos JavaScript ou cadeias JSON? Ou personagens que precisam ser escapados?

Para ser mais específico, eu gostaria de usar "$", "-" e espaço nos nomes das chaves.

Christophe
fonte
Acho que parcialmente essa resposta tem a ver com a maneira como você está codificando. Por exemplo, UTF8 possui caracteres diferentes permitidos em relação ao ANSI.
Invalidsyntax
4
Você pode usar qualquer 'chave' que desejar em JS usando a obj['whatever']notação. Mas apenas chaves alfanuméricas comuns podem ser usadas para a obj.whateverversão.
Marc B
4
@invalidsyntax: JSON é Unicode por definição. Além disso, o ANSI não é uma codificação, é um conjunto de caracteres; portanto, a comparação deve ser Unicode-vs-ANSI, não UTF-8-vs-ANSI.
Marcelo Cantos
1
Discussão antiga, mas ASCII (o que as pessoas costumam chamar de ANSI) é uma codificação e, além disso, também define um conjunto de caracteres.
Trinidad

Respostas:

167

Não. Qualquer sequência válida é uma chave válida. Pode até ter ", desde que você escape:

{"The \"meaning\" of life":42}

Talvez haja uma chance de você encontrar dificuldades ao carregar esses valores em alguns idiomas, que tentam associar chaves a nomes de campos de objetos. Eu não conheço nenhum desses casos, no entanto.

Marcelo Cantos
fonte
THX! Algum outro personagem que precisaria ser escapado? Como: ou; ?
Christophe
11
Não aqueles. Tudo o que precisa ser escapado em JavaScript geralmente precisa em JSON. Melhor tirá-lo da boca do cavalo, no json.org. Demora cerca de um minuto para ler toda a especificação de ponta a ponta.
Marcelo Cantos
3
Esta não é uma boa resposta imho. Que tipo de personagem precisa ser escapado? Quais caracteres podem ser escapados, mas não precisam ser escapados?
Daniel W.
Alguém pode esclarecer se isso inclui coisas como o caractere nulo Unicode (U + 0000, simples "byte nulo" em UTF-8), etc? O json.org e o PDF oficial / formal de especificação do ECMA vinculado parecem implicar que sim, eles são válidos no JSON, mesmo em suas formas literais (não apenas no \u four-hex-digitsformato).
mtraceur
1
@OutofOrbit Você pode simplesmente carregá-lo em um objeto não digitado?
Marcelo Cantos
54

Os caracteres a seguir devem ser escapados nos dados JSON para evitar problemas

' citação única

Citação

\ barra invertida

todos os caracteres de controle como \ n \ t

O Analisador JSON pode ajudá-lo a lidar com o JSON.

EDIT: Aqui está um analisador JSON de substituição, pois o link do OP está inoperante

Arun Rana
fonte
5
Oi Arun, aspas simples não precisam ser escapadas. O fato de escapar deles fará com que os analisadores JSON rigorosos gerem uma exceção. Consulte a seção de strings do json.org. É claro que você precisará escapar delas quando estiver dentro de uma string JSON (mas não a própria JSON).
Alex KeySmith
5
@AlexKey você está completamente certo! Arun, você pode verificar isso em jsonlint.com testando o JSON { "singlequotetest": "something here isn\'t right"}versus{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Seja o
@Arun Rana - não se preocupe.
precisa saber é o seguinte
3
{"* ~ @ # $% ^ & * () _ + => <? /": "é um json válido"}
Abhi
45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos
12

Vale ressaltar que, embora o início das chaves com números seja válido, isso pode causar alguns problemas não intencionais.

Exemplo:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround
karns
fonte
6
Eu realmente espero que, nesta era da Microsoft de 2017/18, eles se arrependam de toda a dor que infligiram.
amigos estão dizendo sobre monsto
1
Observe seus parâmetros de ID de métricas: dev.applicationinsights.io/apiexplorer/… --- 15 ou 20 de seus campos têm várias barras nos seus nomes de campos json. Embora a solução de Karns funcione para um campo específico, não consigo fazê-lo funcionar para um subcampo de 1tile. Por exemplo, um ponto subsequente retorna indefinido para mim.
Jon Luzader
Por que o IE é mencionado lá? Identificadores começando com numérico são ilegais em toda implementação do ECMAScript.
M93a 26/08/19
@ m93a IE não pretende ser uma sigla para Internet Explorer ... má escolha de palavras: /
karns
Esta deve ser a melhor resposta
Joe Elia
7

Os pontos de código Unicode U + D800 a U + DFFF devem ser evitados: eles são inválidos no Unicode porque são reservados para pares substitutos UTF-16. Alguns codificadores / decodificadores JSON os substituirão por U + FFFD. Veja, por exemplo, como a linguagem Go e sua biblioteca JSON lida com eles .

Portanto, evite "\ uD800" para "\ uDFFF" sozinho (não em pares substitutos).

dolmen
fonte