Quels caractères sont valides / non valides dans un nom de clé JSON?

151

Y a-t-il des caractères interdits dans les noms de clé, pour les objets JavaScript ou les chaînes JSON? Ou des personnages qui doivent être échappés?

Pour être plus précis, j'aimerais utiliser "$", "-" et un espace dans les noms de clé.

Christophe
la source
Je pense que cette réponse a en partie à voir avec la façon dont vous encodez. Par exemple, UTF8 a des caractères différents autorisés par rapport à ANSI.
invalidsyntax
4
Vous pouvez utiliser n'importe quelle «clé» de votre choix dans JS en utilisant la obj['whatever']notation. Mais seules les touches alphanumériques ordinaires peuvent être utilisées pour la obj.whateverversion.
Marc B
4
@invalidsyntax: JSON est Unicode par définition. De plus, ANSI n'est pas un encodage, c'est un jeu de caractères, donc la comparaison doit être Unicode-vs-ANSI, pas UTF-8-vs-ANSI.
Marcelo Cantos
1
Ancienne discussion mais, ASCII (ce à quoi les gens se réfèrent souvent par ANSI) est un encodage et en plus de cela, il définit également un jeu de caractères.
Trinidad

Réponses:

168

Non. Toute chaîne valide est une clé valide. Cela peut même durer "tant que vous y échappez:

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

Il y a peut-être une chance que vous rencontriez des difficultés pour charger de telles valeurs dans certaines langues, qui essaient d'associer des clés à des noms de champs d'objet. Cependant, je ne connais aucun cas de ce genre.

Marcelo Cantos
la source
THX! Y a-t-il d'autres personnages qui auraient besoin d'être échappés? Comme: ou; ?
Christophe
11
Pas ceux-là. Tout ce qui doit s'échapper en JavaScript en a généralement besoin en JSON. Il est préférable de l'obtenir de la bouche du cheval, cependant, sur json.org. Il faut environ une minute pour lire l'intégralité des spécifications de bout en bout.
Marcelo Cantos
3
Ce n'est pas une bonne réponse à mon humble avis. Quels types de personnages doivent être échappés? Quels caractères peuvent être échappés, mais ne doivent pas l'être?
Daniel W.18
Quelqu'un peut-il clarifier si cela inclut des choses comme le caractère nul Unicode (U + 0000, simple "octet nul" en UTF-8), etc.? Le json.org et le PDF de spécification ECMA officiel / formel lié semblent impliquer que oui, ceux-ci sont valides en JSON, même sous leur forme littérale (pas seulement sous la \u four-hex-digitsforme).
mtraceur le
1
@OutofOrbit Pouvez-vous simplement le charger dans un objet non typé?
Marcelo Cantos
54

Les caractères suivants doivent être échappés dans les données JSON pour éviter tout problème

' simple citation

" citation

\ barre oblique inverse

tous les caractères de contrôle comme \ n \ t

JSON Parser peut vous aider à gérer JSON.

EDIT: Voici un analyseur JSON de remplacement puisque le lien d'OP est mort

Arun Rana
la source
5
Salut Arun, les guillemets simples n'ont pas besoin d'être échappés. En fait, les échapper entraînera la levée d'une exception par les analyseurs JSON stricts. Reportez-vous à la section string de json.org Bien sûr, cependant, vous devrez les échapper à l'intérieur d'une chaîne JSON (mais pas le JSON lui-même).
Alex KeySmith
5
@AlexKey vous avez tout à fait raison! Arun, vous pouvez vérifier cela sur jsonlint.com en testant le JSON { "singlequotetest": "something here isn\'t right"}versus{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be
@Arun Rana - pas de soucis.
Alex KeySmith
3
{"* ~ @ # $% ^ & * () _ + => <? /": "est un json valide"}
Abhi
45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos
12

Il est à noter que si le démarrage des clés avec des nombres est valide, cela peut entraîner des problèmes involontaires.

Exemple:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround
karns
la source
6
J'espère vraiment qu'en cette ère 2017/18 de Microsoft, ils regrettent toute la douleur qu'ils ont infligée.
monsto
1
Regardez leurs paramètres d'ID de métriques: dev.applicationinsights.io/apiexplorer/… --- 15 ou 20 de leurs champs ont plusieurs barres obliques dans leurs noms de champs json. Bien que la solution de Karns fonctionne pour un champ spécifique, je n'arrive pas à la faire fonctionner pour un sous-champ de 1tile. Par exemple, un point suivant renvoie indéfini pour moi.
Jon Luzader
Pourquoi IE y est-il mentionné? Les identificateurs commençant par numérique sont illégaux dans toutes les implémentations d'ECMAScript.
m93a
@ m93a IE n'est pas un acronyme pour Internet Explorer ... mauvais choix de mots: /
karns
Cela devrait être la meilleure réponse
Joe Elia
7

Les points de code Unicode U + D800 à U + DFFF doivent être évités: ils ne sont pas valides en Unicode car ils sont réservés aux paires de substitution UTF-16. Certains encodeurs / décodeurs JSON les remplaceront par U + FFFD. Voyez par exemple comment le langage Go et sa bibliothèque JSON les traitent .

Évitez donc "\ uD800" à "\ uDFFF" seul (pas dans des paires de substitution).

dolmen
la source