Come sfuggire ai caratteri speciali nella costruzione di una stringa JSON?


200

Ecco la mia corda

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    

Qui il messaggio contiene virgolette singole, che è uguale alla citazione utilizzata in JSON. Quello che faccio è riempire una stringa dagli input dell'utente come il messaggio. Quindi, devo sfuggire a quel tipo di scenari speciali che infrangono il codice. Ma oltre alla sostituzione della stringa, c'è un modo per farli scappare ma consentire comunque all'HTML di elaborarli di nuovo nel messaggio corretto?


45
JSON utilizza solo virgolette doppie, non virgolette singole, vedi json.org
Niels Bom il

4
RFC 4627 afferma che i parser devono essere in grado di analizzare JSON conforme (paragrafo 4) e possono supportare estensioni non JSON aggiuntive. Tuttavia, il paragrafo 5 afferma con enfasi che tutti i produttori (generatori) DEVONO produrre SOLO JSON conforme al 100%. Produrre JSON con caratteri frame che non necessitano di escape è un'idea particolarmente negativa. Ti preghiamo di considerare di sostituire gli apostrofi con le virgolette. ietf.org/rfc/rfc4627.txt
Luv2code

3
@ Luv2code Mentre i punti che stai facendo rimangono veri, tieni presente che stai citando una specifica obsoleta. Quando leggi le RFC, usa sempre la versione tools.ietf.org/html , non la versione testuale. Le versioni HTML sono più facili da leggere e collegano alle sottosezioni e, soprattutto, nella parte superiore delle versioni HTML è un elenco di tutti i successivi RFC che aggiornano o obsoleto quello che stai leggendo. Se sei andato su tools.ietf.org/html/rfc4627 avresti visto che RFC 4627 è obsoleto ed è stato sostituito da RFC 7159 .
Mark Amery,

3
Per le persone che leggeranno
Joram van den Boezem,

Risposte:


286

Una stringa JSON deve essere racchiusa tra virgolette, secondo le specifiche , quindi non è necessario scappare '.
Se devi usare un carattere speciale nella tua stringa JSON, puoi scappare usando il \carattere.

Vedi questo elenco di caratteri speciali utilizzati in JSON:

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character


Tuttavia, anche se è totalmente contrario alle specifiche, l'autore potrebbe usare \'.

Questo è negativo perché:

  • È contrario alle specifiche
  • Non è più una stringa valida JSON

Ma funziona, come lo vuoi o no.

Per i nuovi lettori, utilizzare sempre le doppie virgolette per le stringhe JSON.


30
"stringhe json a virgoletta singola" ? Questo non ha senso; le stringhe in JSON possono essere sempre e solo virgolette doppie. Prova JSON.parse("'foo'")nella tua console del browser, ad esempio, e osserva il SyntaxError: Unexpected token '. Le specifiche JSON sono davvero semplici e chiare al riguardo. Non esiste una sequenza di escape in JSON per virgolette singole e una stringa JSON non può essere tra virgolette singole.
Mark Amery,

15
Anche l'aggiornamento presumibilmente chiarificatore di questa risposta è negativo. Sebbene tecnicamente vero, è fuorviante dire che "non hai bisogno" di scappare ', più o meno allo stesso modo in cui è tecnicamente vero ma fuorviante dire che legalmente non hai bisogno di uccidere bambini. Più corretto sarebbe dire che non puoi scappare '. \'è una sequenza di escape illegale e se lo usi, il tuo JSON non è JSON valido e qualsiasi parser JSON verrà soffocato su di esso. (Certamente JavaScript JSON.parsee Python lo json.loadsfanno.)
Mark Amery,

2
Questa risposta rimane assolutamente senza senso dopo molte modifiche. Sostieni, a torto, che usando stringhe a virgoletta singola in JSON e usando la \'sequenza di escape "funziona, come vuoi o no" . Questo è falso Vi sfido a esporre qualsiasi parser JSON di uso popolare che non si strozzerà con stringhe a virgoletta singola o nella \'sequenza. Ho già sottolineato che JSON.parse("'foo'")e JSON.parse('"\\\'"') (in JavaScript) e json.loads("'foo'")e json.loads('"\\\'"')(in Python) generano entrambe delle eccezioni. Qual è la tua base per l'affermazione che l'uso di questi costrutti "funziona"?
Mark Amery,

10
@ Luv2code citazione interessante. Stai fraintendendolo leggermente; che non significa che ogni personaggio può essere sfuggito semplicemente mettendo un backslash davanti ad esso. Una citazione più completa è "Qualsiasi personaggio può essere evitato. Se il personaggio si trova nel Piano multilingue di base (da U + 0000 a U + FFFF), allora può essere rappresentato come una sequenza di sei caratteri . ... In alternativa, ci sono due - sequenza di caratteri sfugge alle rappresentazioni di alcuni personaggi popolari " . (enfatizzare il mio). Sta dicendo che puoi scappare 'come \u0027, non che puoi scappare come \'.
Mark Amery,

2
@ Luv2code ancora, significa che il mio commento votato che afferma che "non puoi scappare '" (e confrontando un tale atto con l'omicidio di bambini!) È tecnicamente sbagliato; più preciso è dire che puoi sfuggire, proprio come no \'. Non mi ero reso conto che la versione RFC delle specifiche si riferiva a sequenze come \u0027un modo per "sfuggire" ai personaggi che rappresentano. Il punto chiave che \'è illegale, tuttavia, è ancora vero e importante.
Mark Amery,

362

Sono inorridito dalla presenza di disinformazione altamente votata su una domanda così apprezzata su un argomento di base.

Le stringhe JSON non possono essere citate con virgolette singole . Le varie versioni delle specifiche ( l'originale di Douglas Crockford, la versione ECMA e la versione IETF ) dichiarano tutte che le stringhe devono essere citate tra virgolette doppie. Questa non è una questione teorica, né una questione di opinione come suggerisce attualmente la risposta accettata; qualsiasi parser JSON nel mondo reale sbaglierà se provi a farlo analizzare una stringa tra virgolette singole.

La versione di Crockford ed ECMA mostra persino la definizione di una stringa usando una bella immagine, il che dovrebbe chiarire il punto in modo inequivocabile:

Immagine che mostra la definizione di una stringa dalle specifiche JSON

L'immagine carina elenca anche tutte le sequenze di escape legittime all'interno di una stringa JSON:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u seguito da quattro cifre esadecimali

Si noti che, contrariamente alle sciocchezze in alcune altre risposte qui, \'non è mai una sequenza di escape valida in una stringa JSON. Non è necessario, perché le stringhe JSON sono sempre tra virgolette doppie.

Infine, normalmente non dovresti pensare di sfuggire ai personaggi da solo durante la generazione programmatica di JSON (anche se ovviamente lo farai quando modifichi manualmente, per esempio, un file di configurazione basato su JSON). Invece, forma la struttura di dati che vuoi codificare usando qualsiasi tipo di mappa nativa, matrice, stringa, numero, booleano e null della tua lingua, quindi codificala in JSON con una funzione di codifica JSON. Tale funzione è probabilmente integrata in qualsiasi linguaggio tu stia usando, come JavaScript JSON.stringify, PHP json_encodeo Pythonjson.dumps. Se stai usando un linguaggio che non ha tale funzionalità integrata, puoi probabilmente trovare una libreria di analisi e codifica JSON da usare. Se usi semplicemente le funzioni di lingua o libreria per convertire elementi da e verso JSON, non avrai nemmeno bisogno di conoscere le regole di escape di JSON. Questo è ciò che avrebbe dovuto fare la domanda sbagliata che ci si pone qui.


4 byte esadecimali o stuzzichini ?
leetbacoon,

36

Tutti parlano di come fuggire 'in una 'stringa con virgolette letterale. C'è un problema molto più grande qui: i letterali stringa a virgoletta singola non sono validi JSON . JSON si basa su JavaScript, ma non è la stessa cosa. Se stai scrivendo un oggetto letterale all'interno del codice JavaScript, va bene; se in realtà hai bisogno di JSON, devi usarlo ".

Con stringhe tra virgolette doppie, non dovrai sfuggire a '. (E se volessi un valore letterale "nella stringa, lo useresti \".)


1
Ciao, hai detto con stringhe tra virgolette doppie, non dovrai sfuggire a '. Ad esempio, se il mio valore di stringa è "Member's_id" : 4, stai dicendo che non ha bisogno di scappare? Apparentemente sto riscontrando un problema in cui sta dando un errore di codifica errata: UTF-8 e viene letto come Member�s. È un file json generato manualmente.
Shubham,

1
'in una stringa JSON il valore letterale non deve essere sottoposto a escape. L'hai copiato e incollato da qualche parte? Forse è davvero un \u2019, non un apostrofo. La mia ipotesi: qualcuno l'ha digitato in MS Word, che lo ha trasformato in virgolette perché pensa di conoscerlo meglio. Grammaticamente, l'apostrofo del buon vecchio personaggio ASCII ( ', aka \x27, che finora abbiamo chiamato "virgoletta singola") è quello che desideri. Ma sarebbe comunque bello risolvere il problema di codifica dei personaggi, nel caso in cui ci siano altri problemi simili. Quindi scegli una codifica dei caratteri e usala sia in lettura che in scrittura. O scappare usando \u.
David Knipe,

7

La maggior parte di queste risposte o non risponde alla domanda o è inutilmente lunga nella spiegazione.

OK, quindi JSON utilizza solo virgolette doppie, lo capiamo!

Stavo cercando di utilizzare JQuery AJAX per pubblicare dati JSON sul server e successivamente restituire le stesse informazioni. La migliore soluzione alla domanda postata che ho trovato è stata quella di utilizzare:

var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type: "POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

Questo sfuggirà ai personaggi per te.

Ciò è stato suggerito anche da Mark Amery, Great answer BTW

Spero che questo aiuti qualcuno.


0

Forse sono troppo tardi per la festa, ma questo analizzerà / sfuggirà alla singola citazione (non voglio entrare in una battaglia su parse vs fuga) ..

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

0

La risposta alla domanda diretta:
per sicurezza, sostituisci il carattere richiesto con \ u + valore esadecimale a 4 cifre

Esempio: se si desidera sfuggire all'apostrofo 'sostituire con \ u0027
D'Amico diventa D \ u0027Amico

RIFERIMENTO PIACEVOLE: http://es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes


-1 per i riferimenti. La domanda riguarda JSON, ma i riferimenti collegati riguardano JavaScript, ed elenca sequenze di escape che non sono valide in JavaScript come \'.
Mark Amery,

Grazie Mark - Volevo solo dare un angolo alternativo - a seconda di chi arriva qui potrebbe trovare utile. Ma prendo in considerazione JSON e Javascript: grazie per essere un Ninja nei forum.
Luigi D'Amico,

0

Utilizzare encodeURIComponent () per codificare la stringa.

Per esempio. var product_list = encodeURIComponent (JSON.stringify (product_list));

Non è necessario decodificarlo poiché il server Web fa automaticamente lo stesso.


0

Utilizzo dei modelli letterali ...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;

-2

Penso che siamo tutti d'accordo sul fatto che i singoli json non sono veri json. Comunque sia, dobbiamo ancora affrontare la questione dell'evasione "all'interno di una stringa json tra virgolette doppie, in assenza di librerie per farlo per noi.

Sostituire ogni "con un \" NON È ABBASTANZA: L'utente può inserire l'input: \ e l'analisi, di nuovo, fallisce (pensa al perché).

Invece, prima sostituisci ogni \ con \ (doppia barra rovesciata). Solo allora, sostituisci ogni "con \" (barra rovesciata seguita da ").


-2

Per consentire virgolette singole all'interno di una stringa tra virgolette doppie ai fini di json, raddoppi la virgoletta singola. {"X": "Qual è la domanda"} ==> {"X": "Qual è la domanda"}

/codereview/69266/json-conversion-to-single-quotes

La sequenza \ 'non è valida.


2
Raddoppiare una singola citazione in una stringa JSON non sfugge. Significa solo che la tua stringa contiene due virgolette singole, anziché una.
Mark Amery,

-15

per quanto riguarda il post di AlexB:

 \'  Apostrophe or single quote
 \"  Double quote

l'escape delle virgolette singole è valida solo nelle stringhe json tra virgolette singole l'
escaping delle virgolette doppie è valida solo nelle stringhe json tra virgolette doppie

esempio:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid

14
Le stringhe con virgolette singole non sono legali in JSON. JSON non è JavaScript. JSON non consente di sfuggire alla singola citazione. Vedi json.org per il documento molto semplice della sintassi JSON.
srm,

3
downvote - perché le virgolette singole non sono valide!
DominikAngerer,

Le virgolette singole non sono valide in json. Si prega di mostrare un campione funzionante, se possibile
Rohith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.