2011-01-02 33 views
6

Si ejecuto esto en una consola de JavaScript en Chrome o Firebug, funciona bien.¿Por qué no se permiten comillas dobles y barras invertidas en cadenas en el estándar JSON?

JSON.parse('"\u0027"') // Escaped single-quote 

Pero si ejecuto cualquiera de estas 2 líneas en una consola de Javascript, arroja un error.

JSON.parse('"\u0022"') // Escaped double-quote 
JSON.parse('"\u005C"') // Escaped backslash 

RFC 4627 section 2.5 parece implicar que \ y " se permiten caracteres, siempre y cuando estén correctamente escaparon. Sin embargo, los 2 navegadores en los que he probado esto no parecen permitirlo. ¿Hay algo que estoy haciendo mal aquí o en realidad no están permitidos en las cuerdas? También intenté usar \" y \\ en lugar de \u0022 y \u005C respectivamente.

Siento que estoy haciendo algo muy malo, porque me resulta difícil creer que JSON no permita estos caracteres en cadenas, sobre todo porque la especificación no parece mencionar nada de lo que pude encontrar diciendo que no está permitido

Respuesta

8

¡Debes citar la barra invertida!

lo que llamamos una rosa

por cualquier otro nombre olería tan dulce

Una doble cita es una cita doble, no importa cómo lo expresas en la constante de cadena. Si coloca una barra invertida antes de su expresión \u dentro de la constante, entonces el efecto es el de una comilla doble texturizada, que de hecho es lo que tiene.

Lo más interesante de su pregunta es que me ayuda a darme cuenta de que cada analizador de cadenas de JavaScript que he escrito está equivocado.

3

No está escapando la barra diagonal inversa y la comilla doble, ya que \ u00xx está siendo interpretada por el analizador de JavaScript.

JSON.parse('"\\\u0022"') 
JSON.parse('"\\\""') 

y

JSON.parse('"\\\u005C"') 
JSON.parse('"\\\\"') 

funciona como se espera.

+0

'JSON.parse' me ayudó! Gracias ...: D –

4

JavaScript está interpretando las secuencias de escape Unicode antes de que lleguen al analizador JSON. Esto plantea un problema:

  • '"\u0027"' Unquoted primera vez (por JavaScript): "'"
    La segunda vez (por el analizador JSON) JSON como válido que representa la cadena: '

  • '"\u0022"' Unquoted la primera time (por JavaScript): """
    El analizador JSON ve esta versión sin comillas """ como JSON no válida (no se espera la última comilla).

  • '"\u005C"' Unquoted primera vez (por JavaScript): "\"
    El analizador JSON también ve esta versión no indicada "\" como no válido JSON (segunda comilla es escapados y así no interrumpir la cadena).

La solución a esto es para escapar de la secuencia de escape, como \\u.... En realidad, sin embargo, es probable que simplemente no utilizar el analizador JSON. Usado en el contexto correcto (garantizado al envolverlo entre paréntesis, todo JSON es JavaScript válido.

Cuestiones relacionadas