JSON: perché sono sfuggite le barre in avanti?


369

La ragione di questo mi "sfugge".

JSON sfugge alla barra, quindi un hash {a: "a/b/c"}viene serializzato come {"a":"a\/b\/c"}anziché {"a":"a/b/c"}.

Perché?


4
FWIW Non ho mai visto barre rovesciate in fuga in JSON, l'ho appena notato con la libreria Java su code.google.com/p/json-simple
Jason S

24
PHP json_encode()sfugge alle barre in avanti per impostazione predefinita, ma ha l' JSON_UNESCAPED_SLASHESopzione a partire da PHP 5.4.0 (marzo 2012)
Walter Tross

6
Ecco un codice PHP che non sfuggirà ad ogni barra, solo in '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
Rustyx,

Il codice include '</': o inizia con l'eco? Perché iniziare da eco non riesce per me. Semplicemente non capisco niente. Sì, ho sostituito $ obj per la mia variabile :)
marciokoko

JSON non sfugge o serializza nulla ... lo fa il tuo serializzatore JSON. Quale stai usando?
Razze di leggerezza in orbita,

Risposte:


284

JSON non ti richiede di farlo, ti consente di farlo. Inoltre, consente di utilizzare "\ u0061" per "A", ma non è necessario. Consentire \/aiuto quando si incorpora JSON in un <script>tag, che non consente </stringhe interne, come sottolinea Seb.

Alcune API ASP.NET Ajax / JSON di Microsoft utilizzano questa scappatoia per aggiungere ulteriori informazioni, ad es. Un datetime verrà inviato come "\/Date(milliseconds)\/". (Che schifo)


4
Sarebbe una buona cosa, scappare solo </. Sebbene JSON non sia spesso incorporato nei tag script comunque.
Ruben,

8
Vedi questo post del blog per la logica del formato data ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
JSON deve essere sostituito perché un'implementazione particolare di un serializzatore JSON genera alcuni JSON che ( pur essendo JSON interamente valido ) ha alcuni caratteri extra, quindi può anche essere inserito in un elemento di script HTML come un letterale JS ?! Non è tanto buttare fuori il bambino con l'acqua del bagno ma buttarlo fuori perché qualcuno gli ha comprato una serie di ali d'acqua.
Quentin,

15
Quello che non capisco, è il motivo per cui un serializzatore JSON si preoccuperebbe persino di dove finisce JSON. Su una pagina Web, in una richiesta HTTP, qualunque cosa. Lascia che il renderer finale esegua una codifica aggiuntiva, se necessario.
Dan Ross,

5
@ DanRoss E può. L'escaping /non è necessario , è consentito , per facilitare l'uso di JSON. Se non vuoi scappare /, allora non farlo.
Andreas,

35

Le specifiche JSON dicono che PUOI sfuggire alla barra, ma non è necessario.


9
Puoi aggiungere un link a quella specifica sezione?
Ryan Gates,

1
Le specifiche non lo dicono. In realtà tutto ciò che dice è che devi sfuggire al personaggio di Solidus. Vedi ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert,

10
@JoaEbert: un solidus inverso deve essere evitato, ma non è necessario sfuggire a un solidus. La sezione 9 dice "Tutti i caratteri possono essere inseriti tra virgolette ad eccezione dei caratteri che devono essere sfuggiti: virgolette (U + 0022), solido inverso (U + 005C) e i caratteri di controllo da U + 0000 a U + 001F. "
Harold L

4
Grazie Harold! Hai ragione, mostrato anche nella Figura 5, poiché "qualsiasi punto di codice tranne ..." afferma chiaramente che / è facoltativo.
Joa Ebert,

15

Ho fatto la stessa domanda qualche tempo fa e ho dovuto rispondere da solo. Ecco cosa mi è venuto in mente:

Sembra che il mio primo pensiero [ che provenga dalle sue radici JavaScript ] sia stato corretto.

'\/' === '/'in JavaScript e JSON è JavaScript valido. Tuttavia, perché le altre escape ignorate (come \z) non sono consentite in JSON?

La chiave per questo era leggere http://www.cs.tut.fi/~jkorpela/www/revsol.html , seguito da http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . La funzione di escape della barra consente a JSON di essere incorporato in HTML (come SGML) e XML.


5
Un meccanismo strutturato di consegna del payload di dati non dovrebbe essere legato ai costrutti del linguaggio ... poiché ciò potrebbe cambiare in futuro ... ma ciò potrebbe spiegare le decisioni di progettazione se vi fosse uno dei creatori di JSON.

'\ /' === '/' Quindi non ho bisogno di annullare lo slash in avanti quando ricevo il mio jsonp?
Timmetje,

8

PHP sfugge alle barre in avanti per impostazione predefinita, probabilmente è per questo che appare così comunemente. Non sono sicuro del perché, ma probabilmente perché l'incorporamento della stringa "</script>"all'interno di un <script>tag è considerato non sicuro.

Questa funzionalità può essere disabilitata passando il JSON_UNESCAPED_SLASHESflag ma la maggior parte degli sviluppatori non la utilizzerà poiché il risultato originale è già valido JSON.


5

Brutto PHP!

Il JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESdifetto deve essere, non un (strano) possibilità ... come dirlo a PHP-sviluppatori?

L' impostazione predefinita DEVE essere l'uso più frequente e gli standard (correnti) più utilizzati come UTF8. Quanti frammenti di codice PHP nel Github o in altri luoghi necessitano di questa funzionalità "incorporata in HTML" esotica?


2
Detto bene! Tuttavia PHP promuove tutti i suoi strani errori nel futuro, per non rompere nessuno dei comuni bug precedenti in tutti quegli snippet PHP storici corrotti che si diffondono in tutto il mondo come un parassita. Quindi tutte quelle decisioni sbagliate prese da PHP, il che significa che quasi tutte le decisioni su PHP mai, diventano lo standard. Non puoi aspettarti che gli standard cambino, quindi ogni singolo sviluppatore di PHP deve conoscere e implementare tutti quei numeri infiniti di soluzioni alternative contro tutti quei gravi bug trovati in PHP. Inserisci stackoverflow ..
Tino

Ti sbagli completamente. È dovuto a JavaScript. Come indicato di seguito. In JS '\/' === '/'restituisce true. Ti consiglierei di attenermi ai fatti. Molte persone sono in grado di affrontare alcuni nomi di funzioni incoerenti. Solo perché non riesci a vedere il passato che non rende PHP un cattivo strumento.
Cobolt

1
Ciao @Cobolt, è una vecchia domanda, non sto usando PHP oggi ... Ma, come blog di discussione, il nucleo è "L'impostazione predefinita DEVE essere l'uso più frequente" , quindi la bruttezza riguarda ignorare questo "uso più frequente" del comportamento (anche brutto) di Javascript.
Peter Krauss,

1
Questo non è il posto giusto per parlare di una lingua particolare. Indicare cosa fa attualmente PHP e come disabilitarlo sarebbe stato più utile e ora è stata aggiunta una risposta che lo fa .
IMSoP,
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.