Hier ist meine Saite
{
'user': {
'name': 'abc',
'fx': {
'message': {
'color': 'red'
},
'user': {
'color': 'blue'
}
}
},
'timestamp': '2013-10-04T08: 10: 41+0100',
'message': 'I'mABC..',
'nanotime': '19993363098581330'
}
Hier enthält die Nachricht ein einfaches Anführungszeichen, das dem in JSON verwendeten Anführungszeichen entspricht. Was ich tue, ist eine Zeichenfolge aus Benutzereingaben wie Nachricht zu füllen. Also muss ich mich solchen speziellen Szenarien entziehen, die den Code brechen. Gibt es außer dem Ersetzen von Zeichenfolgen eine Möglichkeit, sie zu maskieren und HTML dennoch zu ermöglichen, sie wieder in die richtige Nachricht umzuwandeln?
Antworten:
Eine JSON-Zeichenfolge muss gemäß den Spezifikationen in doppelte Anführungszeichen gesetzt werden , damit Sie nicht entkommen müssen
'
.Wenn Sie in Ihrer JSON-Zeichenfolge Sonderzeichen verwenden müssen, können Sie diese mit
\
Zeichen maskieren.Siehe diese Liste der in JSON verwendeten Sonderzeichen:
Selbst wenn es völlig im Widerspruch zur Spezifikation steht, könnte der Autor verwenden
\'
.Das ist schlecht, weil:
Aber es funktioniert, wie Sie es wollen oder nicht.
Verwenden Sie für neue Leser immer doppelte Anführungszeichen für Ihre JSON-Zeichenfolgen.
quelle
JSON.parse("'foo'")
Sie es zum Beispiel in Ihrer Browserkonsole und beobachten Sie dieSyntaxError: Unexpected token '
. Die JSON-Spezifikation ist sehr einfach und klar . In JSON gibt es keine Escape-Sequenz für einfache Anführungszeichen, und eine JSON-Zeichenfolge kann nicht in einfache Anführungszeichen gesetzt werden.'
, ähnlich wie es technisch wahr ist, aber irreführend zu sagen, dass Sie legal keine Kinder ermorden müssen. Richtiger wäre zu sagen, dass man nicht entkommen kann'
.\'
ist eine unzulässige Escape-Sequenz, und wenn Sie sie verwenden, ist Ihr JSON nicht gültig und jeder JSON-Parser wird daran ersticken. (Sicherlich JavaScriptJSON.parse
und Pythonjson.loads
.)\'
Escape-Sequenz "funktioniert, wie Sie es wollen oder nicht" . Das ist falsch. Ich fordere Sie auf, einen JSON-Parser im allgemeinen Gebrauch auszustellen , der nicht an Zeichenfolgen in einfachen Anführungszeichen oder an der\'
Sequenz erstickt. Ich habe bereits darauf hingewiesen, dassJSON.parse("'foo'")
undJSON.parse('"\\\'"')
(in JavaScript) undjson.loads("'foo'")
undjson.loads('"\\\'"')
(in Python) beide Ausnahmen auslösen. Was um alles in der Welt ist Ihre Grundlage für die Behauptung, dass die Verwendung dieser Konstrukte "funktioniert"?'
als entkommen\u0027
, nicht, dass du als entkommen kannst\'
.'
" (und eine solche Tat mit dem Mord an Kindern zu vergleichen!) Technisch falsch ist; genauer ist zu sagen, dass man ihm entkommen kann, nur nicht als\'
. Ich hatte nicht bemerkt, dass sich die RFC-Version der Spezifikation auf Sequenzen bezog, um\u0027
den Zeichen, die sie darstellen, zu entkommen. Der entscheidende Punkt, der\'
illegal ist, ist jedoch immer noch wahr und wichtig.Ich bin entsetzt über das Vorhandensein von hoch bewerteten Fehlinformationen zu einer so hoch angesehenen Frage zu einem Grundthema.
JSON-Zeichenfolgen können nicht in einfache Anführungszeichen gesetzt werden . Die verschiedenen Versionen der Spezifikation ( das Original von Douglas Crockford, die ECMA-Version und die IETF-Version ) geben alle an, dass Zeichenfolgen in doppelte Anführungszeichen gesetzt werden müssen. Dies ist weder eine theoretische Frage noch eine Ansichtssache, wie die derzeit akzeptierte Antwort nahe legt. Jeder JSON-Parser in der realen Welt wird einen Fehler verursachen, wenn Sie versuchen, eine Zeichenfolge in einfachen Anführungszeichen zu analysieren.
In der Version von Crockford und ECMA wird sogar die Definition eines Strings anhand eines hübschen Bildes angezeigt, was den Punkt eindeutig verdeutlichen sollte:
Das hübsche Bild listet auch alle legitimen Escape-Sequenzen innerhalb einer JSON-Zeichenfolge auf:
\"
\\
\/
\b
\f
\n
\r
\t
\u
gefolgt von vier hexadezimalen ZiffernBeachten Sie, dass im Gegensatz zum Unsinn in einigen anderen Antworten hier
\'
niemals eine gültige Escape-Sequenz in einer JSON-Zeichenfolge vorhanden ist. Dies muss nicht sein, da JSON-Zeichenfolgen immer in doppelte Anführungszeichen gesetzt werden.Schließlich sollten Sie normalerweise nicht daran denken müssen, Zeichen selbst zu maskieren, wenn Sie JSON programmgesteuert generieren (obwohl Sie dies natürlich tun, wenn Sie beispielsweise eine JSON-basierte Konfigurationsdatei manuell bearbeiten). Bilden Sie stattdessen die Datenstruktur, die Sie codieren möchten, mit allen nativen Map-, Array-, String-, Zahlen-, Booleschen- und Nulltypen Ihrer Sprache und codieren Sie sie dann mit einer JSON-Codierungsfunktion in JSON. Eine solche Funktion ist wahrscheinlich in jede Sprache integriert, die Sie verwenden, z. B. JavaScript
JSON.stringify
, PHPjson_encode
oder Pythonjson.dumps
. Wenn Sie eine Sprache verwenden, in der solche Funktionen nicht integriert sind, finden Sie wahrscheinlich eine JSON-Analyse- und Codierungsbibliothek, die Sie verwenden können. Wenn Sie einfach Sprach- oder Bibliotheksfunktionen verwenden, um Dinge in und aus JSON zu konvertieren, müssen Sie nicht einmal die Escape-Regeln von JSON kennen. Dies hätte der fehlgeleitete Fragesteller hier tun sollen.quelle
Alle reden darüber, wie man
'
in einem'
zitierten String-Literal entkommt. Hier gibt es ein viel größeres Problem: String-Literale in einfachen Anführungszeichen sind kein gültiges JSON . JSON basiert auf JavaScript, aber es ist nicht dasselbe. Wenn Sie ein Objektliteral in JavaScript-Code schreiben, ist das in Ordnung. Wenn Sie JSON tatsächlich benötigen, müssen Sie verwenden"
.Mit Zeichenfolgen in doppelten Anführungszeichen müssen Sie dem nicht entkommen
'
. (Und wenn Sie ein Literal"
in der Zeichenfolge möchten , würden Sie verwenden\"
.)quelle
'
. Feind Beispiel, wenn mein String-Wert ist"Member's_id" : 4
, sagen Sie, dass es nicht maskiert werden muss? Anscheinend habe ich ein Problem, bei dem ein Fehler bei der falschen Codierung auftritt: UTF-8 und es wird als gelesenMember�s
. Es ist eine manuell generierte JSON-Datei.'
in einem JSON-String darf das Literal nicht maskiert werden. Haben Sie es von irgendwoher kopiert und eingefügt? Vielleicht ist es wirklich\u2019
ein Apostroph. Meine Vermutung: Jemand hat es in MS Word eingegeben, was es in ein Anführungszeichen verwandelt hat, weil es glaubt, es am besten zu wissen. Grammatisch gesehen ist das gute alte ASCII-Zeichen-Apostroph ('
auch bekannt\x27
als "einfaches Anführungszeichen") das, was Sie wollen. Aber es wäre trotzdem schön, das Problem mit der Zeichenkodierung zu beheben, falls es andere ähnliche Probleme gibt. Wählen Sie also eine Zeichenkodierung aus und verwenden Sie sie sowohl zum Lesen als auch zum Schreiben. Oder entkommen mit\u
.Die meisten dieser Antworten beantworten die Frage entweder nicht oder sind in der Erklärung unnötig lang.
OK, JSON verwendet nur doppelte Anführungszeichen, das verstehen wir!
Ich habe versucht, JQuery AJAX zu verwenden, um JSON-Daten auf dem Server zu veröffentlichen und später dieselben Informationen zurückzugeben. Die beste Lösung für die gestellte Frage war:
Dies entgeht den Charakteren für Sie.
Dies wurde auch von Mark Amery vorgeschlagen
Hoffe das hilft jemandem.
quelle
Vielleicht bin ich zu spät zur Party, aber dies wird ein einfaches Zitat analysieren / entkommen (ich möchte nicht in einen Kampf zwischen Analyse und Flucht geraten).
quelle
Die Antwort auf die direkte Frage:
Ersetzen Sie aus Sicherheitsgründen das gewünschte Zeichen durch \ u + 4-stelligen Hex-Wert
Beispiel: Wenn Sie dem Apostroph entkommen möchten, ersetzen Sie ihn durch \ u0027.
D'Amico wird zu D \ u0027Amico
Schöne Referenz: http://es5.github.io/x7.html#x7.8.4
https://mathiasbynens.be/notes/javascript-escapes
quelle
\'
.Verwenden Sie encodeURIComponent (), um die Zeichenfolge zu codieren.
Z.B. var product_list = encodeURIComponent (JSON.stringify (product_list));
Sie müssen es nicht dekodieren, da der Webserver automatisch dasselbe tut.
quelle
Verwenden von Vorlagenliteralen ...
quelle
Ich denke, wir sind uns alle einig, dass einfach zitierte jsons keine echten jsons sind. Wie dem auch sei, wir müssen uns immer noch mit der Frage des Entkommens "innerhalb eines doppelt zitierten JSON-Strings befassen, da keine Bibliotheken vorhanden sind, die dies für uns tun."
Das Ersetzen jedes "durch ein" ist NICHT GENUG: Der Benutzer kann die Eingabe eingeben: \ und das Parsen schlägt erneut fehl (überlegen Sie warum).
Ersetzen Sie stattdessen zuerst jedes \ durch \ (doppelter Backslash). Erst dann ersetzen Sie jedes "durch" (Backslash gefolgt von ").
quelle
Um einfache Anführungszeichen in einer doppelten Zeichenfolge für json zuzulassen, verdoppeln Sie das einfache Anführungszeichen. {"X": "Was ist die Frage"} ==> {"X": "Was ist die Frage"}
/codereview/69266/json-conversion-to-single-quotes
Die \ 'Sequenz ist ungültig.
quelle
zu AlexBs Beitrag:
Das Anhalten von einfachen Anführungszeichen ist nur in JSON-Zeichenfolgen mit einfachen Anführungszeichen gültig. Das Anhalten von
doppelten Anführungszeichen ist nur in JSON-Zeichenfolgen mit doppelten Anführungszeichen gültig
Beispiel:
quelle