Wie entkomme ich Sonderzeichen beim Erstellen einer JSON-Zeichenfolge?

200

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?

dinesh707
quelle
45
JSON verwendet nur doppelte Anführungszeichen, keine einfachen Anführungszeichen, siehe json.org
Niels Bom
4
RFC 4627 besagt, dass Parser in der Lage sein müssen, konformes JSON zu analysieren (Absatz 4), und möglicherweise zusätzliche Nicht-JSON-Erweiterungen unterstützen. In Absatz 5 heißt es jedoch nachdrücklich, dass alle Hersteller (Generatoren) NUR 100% konformes JSON produzieren dürfen. Besonders schlecht ist es, JSON mit Frame-Zeichen zu erstellen, die nicht maskiert werden müssen. Bitte erwägen Sie, Ihre Apostrophe durch Anführungszeichen zu ersetzen. ietf.org/rfc/rfc4627.txt
Luv2code
3
@ Luv2code Während die Punkte, die Sie machen, wahr bleiben, beachten Sie, dass Sie eine veraltete Spezifikation zitieren. Verwenden Sie beim Lesen von RFCs immer die Version tools.ietf.org/html , nicht die Textversion. Die HTML-Versionen sind einfacher zu lesen und mit Unterabschnitten zu verknüpfen. Am wichtigsten ist, dass oben in den HTML-Versionen eine Liste aller nachfolgenden RFCs angezeigt wird, die den von Ihnen gelesenen aktualisieren oder veralten. Wenn Sie zu tools.ietf.org/html/rfc4627 gegangen wären , hätten Sie gesehen, dass RFC 4627 veraltet ist und durch RFC 7159 ersetzt wurde .
Mark Amery
3
Für Leute, die dies in Zukunft lesen, wurde RFC 7159 wiederum von tools.ietf.org/html/rfc8259
Joram van den Boezem am

Antworten:

286

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:

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


Selbst wenn es völlig im Widerspruch zur Spezifikation steht, könnte der Autor verwenden \'.

Das ist schlecht, weil:

  • Es widerspricht den Spezifikationen
  • Es ist keine JSON-gültige Zeichenfolge mehr

Aber es funktioniert, wie Sie es wollen oder nicht.

Verwenden Sie für neue Leser immer doppelte Anführungszeichen für Ihre JSON-Zeichenfolgen.

AlexB
quelle
30
"einfach zitierte json string" ? Das ist schwachsinn; Zeichenfolgen in JSON können immer nur in doppelte Anführungszeichen gesetzt werden. Versuchen JSON.parse("'foo'")Sie es zum Beispiel in Ihrer Browserkonsole und beobachten Sie die SyntaxError: 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.
Mark Amery
15
Sogar das angeblich klärende Update dieser Antwort ist schlecht. Obwohl dies technisch wahr ist, ist es irreführend zu sagen, dass Sie "nicht brauchen" , um zu fliehen ', ä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 JavaScript JSON.parseund Python json.loads.)
Mark Amery
2
Diese Antwort bleibt nach vielen Änderungen völliger Unsinn. Sie behaupten fälschlicherweise, dass die Verwendung von Zeichenfolgen in einfachen Anführungszeichen in JSON und die \'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, dass JSON.parse("'foo'")und JSON.parse('"\\\'"') (in JavaScript) und json.loads("'foo'")und json.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"?
Mark Amery
10
@ Luv2code interessantes Zitat. Sie interpretieren es leicht falsch; Es bedeutet nicht , dass ein Charakter einfach durch einen Backslash entkommen kann. Ein vollständigeres Zitat lautet: "Jedes Zeichen kann maskiert werden. Wenn sich das Zeichen in der mehrsprachigen Grundebene befindet (U + 0000 bis U + FFFF), kann es als sechsstellige Sequenz dargestellt werden . ... Alternativ gibt es zwei -Zeichensequenz-Escape-Darstellungen einiger populärer Charaktere. "(Hervorhebung von mir). Es heißt, du kannst 'als entkommen \u0027, nicht, dass du als entkommen kannst \'.
Mark Amery
2
@ Luv2code noch, es bedeutet, dass mein hochgelobter Kommentar, dass "Sie nicht entkommen können '" (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 \u0027den Zeichen, die sie darstellen, zu entkommen. Der entscheidende Punkt, der \'illegal ist, ist jedoch immer noch wahr und wichtig.
Mark Amery
361

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:

Bild, das die Definition einer Zeichenfolge aus der JSON-Spezifikation zeigt

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 Ziffern

Beachten 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, PHP json_encodeoder 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.

Mark Amery
quelle
4 hexadezimale Bytes oder Knabbereien ?
Leetbacoon
36

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 \".)

David Knipe
quelle
1
Hallo, du hast mit doppelten Anführungszeichen gesagt, du musst dem nicht entkommen '. 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 gelesen Member�s. Es ist eine manuell generierte JSON-Datei.
Shubham
1
'in einem JSON-String darf das Literal nicht maskiert werden. Haben Sie es von irgendwoher kopiert und eingefügt? Vielleicht ist es wirklich \u2019ein 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 \x27als "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.
David Knipe
7

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:

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

Dies entgeht den Charakteren für Sie.

Dies wurde auch von Mark Amery vorgeschlagen

Hoffe das hilft jemandem.

Super
quelle
0

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).

JSON.parse("\"'\"")
YankTHEcode
quelle
0

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

Luigi D'Amico
quelle
-1 für die Referenzen. Die Frage bezieht sich auf JSON, aber Ihre verknüpften Referenzen beziehen sich auf JavaScript und listen Escape-Sequenzen auf, die in JavaScript nicht gültig sind \'.
Mark Amery
Danke Mark - ich wollte wirklich nur einen alternativen Blickwinkel angeben - je nachdem, wer hier ankommt, kann dies nützlich sein. Aber ich verstehe Ihren Standpunkt zu JSON & Javascript - Danke, dass Sie ein Ninja in den Foren sind.
Luigi D'Amico
0

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.

Sanju Kaniyamattam
quelle
0

Verwenden von Vorlagenliteralen ...

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

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 ").

Tom Blitz
quelle
-2

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.

4T2G
quelle
2
Das Verdoppeln eines einzelnen Anführungszeichens in einer JSON-Zeichenfolge entgeht ihm nicht. Es bedeutet nur, dass Ihre Zeichenfolge zwei einfache Anführungszeichen anstelle von einem enthält.
Mark Amery
-15

zu AlexBs Beitrag:

 \'  Apostrophe or single quote
 \"  Double quote

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:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid
Bart
quelle
14
Zeichenfolgen in einfachen Anführungszeichen sind in JSON nicht zulässig. JSON ist kein Javascript. JSON erlaubt es nicht, dem einfachen Anführungszeichen zu entkommen. Unter json.org finden Sie das sehr einfache Dokument der JSON-Syntax.
srm
3
downvote - weil einfache Anführungszeichen jsons nicht gültig sind!
DominikAngerer
Einfache Anführungszeichen sind in json ungültig. Bitte zeigen Sie ein funktionierendes Beispiel, wenn dies möglich ist
Rohith