2011-12-30 20 views
94

¿Hay caracteres prohibidos en los nombres de las teclas, para objetos JavaScript o cadenas JSON? O los personajes que necesitan ser escapados?¿Qué caracteres son válidos/inválidos en un nombre de clave JSON?

Para ser más específicos, me gustaría usar "$", "-" y espacio en los nombres de las teclas.

+0

creo que en parte esta respuesta tiene que ver con la forma en que está la codificación. Por ejemplo, UTF8 tiene diferentes caracteres permitidos frente a ANSI. – invalidsyntax

+2

Puede usar cualquier 'tecla' que desee en JS usando la notación 'obj ['whatever']'. Pero solo las claves alfanuméricas regulares se pueden usar para la versión 'obj.whatever'. –

+3

@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. –

Respuesta

116

No. Cualquier cadena válida es una clave válida. Se puede incluso tener " todo el tiempo que se escapa:

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

Hay quizás una posibilidad de que usted encuentra dificultades que cargan dichos valores en algunos idiomas, que tratan de asociar teclas con nombres de campo objeto. Sin embargo, no conozco ninguno de estos casos.

+0

¡Thx! ¿Algún otro personaje que necesite ser escapado? Me gusta: o; ? – Christophe

+8

No esos. Cualquier necesidad que escapa en JavaScript generalmente lo necesita en JSON. Es mejor sacarlo de la boca del caballo, sin embargo, en json.org. Se tarda aproximadamente un minuto en leer toda la especificación de extremo a extremo. –

+0

Esta no es una buena respuesta. ¿Qué tipo de personajes deben escaparse? ¿Qué personajes se pueden escapar, pero no se tienen que escapar? – DanFromGermany

40

los siguientes caracteres deben escaparse de datos JSON para evitar cualquier problema

'comilla simple

”cita

\ backslash

todos los caracteres de control como \ n \ t

JSON Parser puede ayudarte a lidiar con JSON.

EDIT: Here's a replacement JSON parser since OP's link is dead

+4

Hola Arun, las comillas simples no necesitan escaparse. De hecho, escapándolos hará que los analizadores terminados de JSON arrojen una excepción. Consulte la sección de cadenas de http://www.json.org Por supuesto, sin embargo, tendrá que escapar de ellas cuando esté dentro de una cadena JSON (pero no en el JSON en sí). –

+3

@AlexKey ¡tienes toda la razón! Arun, puedes verificar esto en [jsonlint.com] (http://jsonlint.com/) probando el JSON '{" singlequotetest ":" algo aquí no está bien "}' contra '{" singlequotetest ": "Reparar aquí lo que no estaba bien"} ' –

+0

@Arun Rana - sin preocupaciones. –

5

Unicode puntos de código U + D800 a U + DFFF debe evitarse: son invalid en Unicode porque están reservados para UTF-16 pares suplentes. Algunos codificadores/decodificadores JSON los reemplazarán con U + FFFD. Ver por ejemplo how the Go language and its JSON library deals with them.

Así que evite "\ uD800" a "\ uDFFF" solo (no en pares de sustitución).

4

Vale la pena mencionar que aunque iniciar las claves con números es válido, podría causar algunos problemas no deseados.

IE:

var testObject = { 
    "1tile": "test value" 
}; 
console.log(testObject.1tile); // fails, invalid syntax 
console.log(testObject["1tile"]; // workaround 
+0

Realmente espero que, en esta era 2017/18 de Microsoft, se arrepientan de todo el dolor que han infligido. – monsto

+0

Mire los parámetros de ID de sus indicadores: https://dev.applicationinsights.io/apiexplorer/metrics?appId=DEMO_APP&apiKey=DEMO_KEY&metricId=requests%2Fcount×pan=PT1H --- 15 o 20 de sus campos tienen múltiples barras diagonales en su campo json nombres. 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 devuelve indefinido para mí. –

Cuestiones relacionadas