JSON: Warum werden Schrägstriche entkommen?

369

Der Grund dafür "entgeht" mir.

JSON entgeht dem Schrägstrich, sodass ein Hash {a: "a/b/c"}als {"a":"a\/b\/c"}statt serialisiert wird {"a":"a/b/c"}.

Warum?

Jason S.
quelle
4
FWIW Ich habe noch nie gesehen, dass Schrägstriche in JSON entkommen sind. Ich habe es gerade mit der Java-Bibliothek unter code.google.com/p/json-simple
Jason S
24
PHP json_encode()entgeht standardmäßig Schrägstrichen, hat aber die JSON_UNESCAPED_SLASHESOption ab PHP 5.4.0 (März 2012)
Walter Tross
6
Hier ist ein PHP-Code, der nicht jedem Schrägstrich '</'echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
entgeht
Enthält der Code das '</': oder beginnt er beim Echo? Weil das Starten bei Echo für mich fehlschlägt. Ich bekomme einfach nichts. Ja, ich habe mein $ obj für meine Variable ersetzt :)
marciokoko
JSON entkommt oder serialisiert nichts ... Ihr JSON-Serializer tut dies. Welches benutzt du?
Leichtigkeitsrennen im Orbit

Antworten:

284

JSON verlangt dies nicht von Ihnen, es ermöglicht Ihnen dies. Sie können auch "\ u0061" für "A" verwenden, dies ist jedoch nicht erforderlich. Das Zulassen \/hilft beim Einbetten von JSON in ein <script>Tag, das keine </inneren Zeichenfolgen zulässt , wie Seb betont.

Einige der ASP.NET Ajax / JSON-APIs von Microsoft verwenden diese Lücke, um zusätzliche Informationen hinzuzufügen, z. B. wird eine Datums- und Uhrzeitangabe als gesendet "\/Date(milliseconds)\/". (Yuck)

Ruben
quelle
4
Das wäre eine gute Sache, nur </ zu entkommen. Obwohl JSON ohnehin nicht oft in Skript-Tags eingebettet ist.
Ruben
8
In diesem Blog-Beitrag finden Sie die Gründe
Michiel van Oosterhout
25
JSON muss ersetzt werden, da eine bestimmte Implementierung eines JSON-Serialisierers JSON ausgibt, das ( obwohl es vollständig gültig ist ) einige zusätzliche Zeichen enthält, sodass es auch als JS-Literal in ein HTML-Skriptelement eingefügt werden kann?! Das bedeutet nicht, das Baby mit dem Badewasser herauszuwerfen, sondern es wegzuwerfen, weil ihm jemand einen Satz Wasserflügel gekauft hat.
Quentin
15
Was ich nicht verstehe, ist, warum es einem JSON-Serializer sogar wichtig ist, wo der JSON landet. Auf einer Webseite, in einer HTTP-Anfrage, was auch immer. Lassen Sie den endgültigen Renderer bei Bedarf zusätzliche Codierungen vornehmen.
Dan Ross
5
@ DanRoss Und es kann. Flüchten /ist nicht erforderlich , es ist erlaubt , die Verwendung von JSON zu erleichtern. Wenn du nicht entkommen willst /, dann nicht.
Andreas
35

Die JSON-Spezifikation besagt, dass Sie einem Schrägstrich entkommen können, dies aber nicht müssen.

Harold L.
quelle
9
Können Sie einen Link zu diesem bestimmten Abschnitt hinzufügen?
Ryan Gates
1
Die Spezifikation sagt das nicht. Tatsächlich heißt es nur, dass man dem Solidus-Charakter entkommen muss. Siehe ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert
10
@JoaEbert: Ein umgekehrter Solidus muss entkommen, aber Sie müssen einem Solidus nicht entkommen. In Abschnitt 9 heißt es: "Alle Zeichen dürfen in Anführungszeichen gesetzt werden, mit Ausnahme der Zeichen, die maskiert werden müssen: Anführungszeichen (U + 0022), umgekehrter Solidus (U + 005C) und die Steuerzeichen U + 0000 bis U + 001F. ""
Harold L
4
Danke Harold! Sie haben Recht, auch in Abbildung 5 gezeigt, da "jeder Codepunkt außer ..." eindeutig angibt, dass / optional ist.
Joa Ebert
15

Ich habe die gleiche Frage vor einiger Zeit gestellt und musste sie selbst beantworten. Folgendes habe ich mir ausgedacht:

Es scheint, mein erster Gedanke [ dass er von seinen JavaScript-Wurzeln stammt ] war richtig.

'\/' === '/'in JavaScript und JSON ist gültiges JavaScript. Warum sind die anderen ignorierten Escapezeichen (wie \z) in JSON nicht zulässig?

Der Schlüssel dazu war das Lesen von http://www.cs.tut.fi/~jkorpela/www/revsol.html , gefolgt von http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . Mit der Funktion des Schrägstrichs kann JSON in HTML (als SGML) und XML eingebettet werden.

Boldewyn
quelle
5
Ein strukturierter Mechanismus zur Bereitstellung von Datennutzdaten sollte nicht an Sprachkonstrukte gebunden sein. Dies kann sich in Zukunft ändern. Dies könnte jedoch die Entwurfsentscheidungen erklären, wenn es einen der JSON-Ersteller gibt.
'\ /' === '/' Also muss ich beim Empfang meines Jsonp keine Schrägstriche entfernen?
Timmetje
8

PHP entgeht standardmäßig Schrägstrichen, weshalb dies wahrscheinlich so häufig vorkommt. Ich bin mir nicht sicher warum, aber möglicherweise, weil das Einbetten der Zeichenfolge "</script>"in ein <script>Tag als unsicher angesehen wird.

Diese Funktionalität kann durch Übergabe des JSON_UNESCAPED_SLASHESFlags deaktiviert werden. Die meisten Entwickler verwenden dies jedoch nicht, da das ursprüngliche Ergebnis bereits gültiges JSON ist.

Simon East
quelle
5

Hässliches PHP!

Das JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESmuss Standard sein, keine (seltsame) Option ... Wie sagt man es PHP-Entwicklern?

Die Standardeinstellung MUSS die am häufigsten verwendete und die (derzeit) am häufigsten verwendeten Standards als UTF8 sein. Wie viele PHP-Code-Fragmente im Github oder an einem anderen Ort benötigen diese exoktische Funktion "In HTML eingebettet"?

Peter Krauss
quelle
2
Richtig gesagt! PHP wirbt jedoch für alle seine seltsamen Fehler in der Zukunft, um keinen der häufigsten Fehler in all den beschädigten historischen PHP-Schnipsel zu beseitigen, die sich wie ein Schädling auf der ganzen Welt verbreiten. Daher werden all diese falschen Entscheidungen von PHP, was bedeutet, dass fast alle Entscheidungen über PHP jemals zum Standard werden. Sie können nicht erwarten, dass sich die Standards ändern, daher muss jeder einzelne PHP-Entwickler all diese unendlichen Problemumgehungen gegen all die schwerwiegenden Fehler in PHP kennen und implementieren. Geben Sie Stackoverflow ein ..
Tino
Du liegst völlig falsch. Es liegt an JavaScript. Wie unten ausgeführt. In JS wird '\/' === '/'true zurückgegeben. Ich würde Ihnen raten, sich an Fakten zu halten. Die meisten Menschen sind in der Lage, mit einigen inkonsistenten Funktionsnamen umzugehen. Nur weil Sie nicht in der Vergangenheit sehen können, ist PHP kein schlechtes Werkzeug.
Cobolt
1
Hallo @ Cobolt, es ist eine alte Frage, ich benutze heute kein PHP ... Aber als Diskussionsblog lautet der Kern "Die Standardeinstellung MUSS die häufigste Verwendung sein" , also geht es bei Hässlichkeit darum, diese "häufigste Verwendung" zu ignorieren. des (auch hässlichen) Verhaltens von Javascript.
Peter Krauss
1
Dies ist nicht der Ort, um über eine bestimmte Sprache zu schimpfen. Es wäre hilfreicher gewesen, darauf hinzuweisen, was PHP derzeit tut und wie es deaktiviert werden kann, und es wurde nun eine Antwort hinzugefügt, die dies tut .
IMSoP