¿Qué caracteres son válidos / inválidos en un nombre de clave JSON?

151

¿Hay caracteres prohibidos en los nombres clave, para objetos JavaScript o cadenas JSON? ¿O los personajes que necesitan escapar?

Para ser más específico, me gustaría usar "$", "-" y espacio en los nombres clave.

Christophe
fuente
Creo que parcialmente esta respuesta tiene que ver con la forma en que codificas. Por ejemplo, UTF8 tiene diferentes caracteres permitidos en comparación con ANSI.
invalidsyntax
44
Puede usar cualquier 'clave' que desee en JS usando la obj['whatever']notación. Pero solo se pueden usar claves alfanuméricas regulares para la obj.whateverversión.
Marc B
44
@invalidsyntax: JSON es Unicode por definición. Además, ANSI no es una codificación, es un conjunto de caracteres, por lo que la comparación debe ser Unicode-vs-ANSI, no UTF-8-vs-ANSI.
Marcelo Cantos
1
Antigua discusión, pero ASCII (a lo que la gente se refiere a menudo por ANSI) es una codificación y, además, también define un conjunto de caracteres.
Trinidad

Respuestas:

167

No. Cualquier cadena válida es una clave válida. Incluso puede "durar mientras escapas:

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

Quizás exista la posibilidad de que encuentre dificultades para cargar dichos valores en algunos idiomas, que intentan asociar claves con nombres de campos de objetos. Sin embargo, no conozco ninguno de estos casos.

Marcelo Cantos
fuente
¡Gracias! ¿Algún otro personaje que deba escaparse? Me gusta: o; ?
Christophe
11
No esos. Lo que necesite escapar en JavaScript generalmente lo necesita en JSON. Sin embargo, es mejor obtenerlo de la boca del caballo en json.org. Se tarda aproximadamente un minuto en leer la especificación completa de principio a fin.
Marcelo Cantos
3
Esta no es una buena respuesta en mi humilde opinión. ¿Qué tipo de personajes se deben escapar? ¿Qué personajes se pueden escapar, pero no es necesario escapar?
Daniel
¿Alguien puede aclarar si esto incluye cosas como el carácter nulo Unicode (U + 0000, "byte nulo" en UTF-8), etc. Tanto el json.org como el PDF de especificación oficial / formal de ECMA vinculado parecen implicar que sí, esos son válidos en JSON, incluso en sus formas literales (no solo en el \u four-hex-digitsformulario).
mtraceur
1
@OutofOrbit ¿Puede cargarlo en un objeto sin tipo?
Marcelo Cantos
54

Los siguientes caracteres deben escaparse en los datos JSON para evitar problemas

' una frase

"Cita

\ barra invertida

todos los caracteres de control como \ n \ t

JSON Parser puede ayudarte a lidiar con JSON.

EDITAR: Aquí hay un analizador JSON de reemplazo ya que el enlace de OP está muerto

Arun Rana
fuente
55
Hola Arun, no es necesario escapar de las comillas simples. De hecho, escapar de ellos hará que los analizadores JSON estrictos arrojen una excepción. Consulte la sección de cadenas de json.org. Por supuesto, deberá escapar de ellas cuando se encuentre dentro de una cadena JSON (pero no la JSON en sí).
Alex KeySmith
55
@AlexKey tienes toda la razón! Arun, puedes verificar esto en jsonlint.com probando el JSON { "singlequotetest": "something here isn\'t right"}versus{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be
@Arun Rana: no te preocupes.
Alex KeySmith
3
{"* ~ @ # $% ^ & * () _ + => <? /": "es un json válido"}
Abhi
45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos
12

Vale la pena mencionar que si bien el inicio de las teclas con números es válido, podría causar algunos problemas no deseados.

Ejemplo:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround
karns
fuente
66
Realmente espero que, en esta era 2017/18 de Microsoft, se arrepientan de todo el dolor que han infligido.
Monsto
1
Mire sus parámetros de ID de métrica: dev.applicationinsights.io/apiexplorer/… --- 15 o 20 de sus campos tienen múltiples barras diagonales en sus nombres de campo json. Si bien la solución de Karns funciona para un campo específico, parece que no puedo hacer que funcione para un subcampo de 1tile. Por ejemplo, un punto posterior vuelve indefinido para mí.
Jon Luzader
¿Por qué se menciona IE allí? Los identificadores que comienzan con numérico son ilegales en cada implementación de ECMAScript.
m93a
@ m93a IE no pretende ser un acrónimo de Internet Explorer ... mala elección de palabras: /
karns
Esta debería ser la mejor respuesta
Joe Elia
7

Se deben evitar los puntos de código Unicode U + D800 a U + DFFF: no son válidos en Unicode porque están reservados para pares sustitutos UTF-16. Algunos codificadores / decodificadores JSON los reemplazarán con U + FFFD. Vea, por ejemplo, cómo el lenguaje Go y su biblioteca JSON se ocupan de ellos .

Así que evite "\ uD800" a "\ uDFFF" solo (no en pares sustitutos).

dolmen
fuente