2011-01-02 10 views
6

Se eseguo questa operazione in una console JavaScript in Chrome o Firebug, funziona correttamente.Perché le virgolette doppie e le barre retroverse non sono consentite nelle stringhe nello standard JSON?

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

Ma se ho eseguito una di queste 2 righe in una console Javascript, si genera un errore.

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

RFC 4627 section 2.5 sembra implicare che \ e " sono ammessi caratteri fintanto che stanno correttamente fuggiti. I 2 browser che ho provato in questo non sembrano consentirlo, tuttavia. C'è qualcosa che sto sbagliando qui o non sono ammessi nelle stringhe? Ho anche provato a utilizzare \" e \\ al posto di \u0022 e \u005C rispettivamente.

Mi sento come se stessi facendo qualcosa di molto sbagliato, perché trovo difficile credere che JSON non consentirebbe a questi caratteri nelle stringhe, specialmente dal momento che le specifiche non sembrano menzionare nulla che potrei trovare dicendo che loro Non sono permesso.

risposta

8

È necessario citare il backslash!

ciò che noi chiamiamo una rosa

con qualsiasi altro nome avrebbe il suo profumo

Una doppia citazione è una doppia citazione, non importa come si esprime nella stringa costante. Se si inserisce una barra rovesciata prima dell'espressione \u all'interno della costante, l'effetto è quello di una virgoletta con citazione rovesciata, che è in effetti ciò che si ha.

La cosa più interessante della tua domanda è che mi aiuta a capire che ogni parser di stringa JavaScript che ho mai scritto è sbagliato.

3

Non si sta eseguendo l'escape del backslash e del double-quote, poiché \ u00xx viene interpretato dal parser javascript.

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

e

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

funzionare come previsto.

+0

'JSON.parse' mi ha aiutato! Grazie ...: D –

4

JavaScript sta interpretando le sequenze di escape Unicode prima che arrivino al parser JSON. Questo pone un problema:

  • '"\u0027"' unquoted la prima volta (da JavaScript): "'"
    La seconda volta (dal parser JSON) JSON valido che rappresenta la stringa: '

  • '"\u0022"' unquoted primo time (by JavaScript): """
    Il parser JSON vede questa versione non quotata """ come JSON non valido (non si aspetta l'ultimo segno di virgolette).

  • '"\u005C"' non quotate per la prima volta (da JavaScript): "\"
    Il parser JSON vede anche questa versione non quotate "\" come non validi JSON (seconda tacca citazione è backslash escape e quindi non terminare la stringa).

La correzione di questo è quello di fuggire la sequenza di escape, come \\u.... In realtà, però, si sarebbe probabilmente semplicemente non utilizzare il parser JSON. Utilizzato nel contesto corretto (assicurato avvolgendolo tra parentesi, tutto JSON è valido JavaScript

Problemi correlati