Gemäß dem Zustandsmaschinendiagramm auf der JSON-Website sind nur maskierte doppelte Anführungszeichen zulässig, keine einfachen Anführungszeichen. Einfache Anführungszeichen müssen nicht maskiert werden:
Update - Weitere Informationen für Interessierte:
Douglas Crockford gibt nicht ausdrücklich an, warum die JSON-Spezifikation keine maskierten einfachen Anführungszeichen innerhalb von Zeichenfolgen zulässt. Während seiner Diskussion über JSON in Anhang E von JavaScript: The Good Parts schreibt er jedoch:
Die Designziele von JSON waren minimal, portabel, textuell und eine Teilmenge von JavaScript. Je weniger wir uns einigen müssen, um zusammenarbeiten zu können, desto leichter können wir zusammenarbeiten.
Vielleicht hat er beschlossen, Zeichenfolgen nur mit doppelten Anführungszeichen zu definieren, da dies eine Regel weniger ist, auf die sich alle JSON-Implementierungen einigen müssen. Infolgedessen kann ein einfaches Anführungszeichen innerhalb einer Zeichenfolge die Zeichenfolge nicht versehentlich beenden, da eine Zeichenfolge per Definition nur durch ein Zeichen in doppelten Anführungszeichen abgeschlossen werden kann. Daher ist es nicht erforderlich, das Entkommen eines einzelnen Anführungszeichens in der formalen Spezifikation zuzulassen.
Graben ein wenig tiefer, Crockford
org.json ist Implementierung von JSON für Java mehr zulässig und
tut Apostrophe ermöglichen:
Die von den toString-Methoden erstellten Texte entsprechen streng den JSON-Syntaxregeln. Die Konstrukteure sind in den Texten, die sie akzeptieren, verzeihender:
...
- Zeichenfolgen können mit '(einfaches Anführungszeichen) zitiert werden.
Dies wird durch den JSONTokener- Quellcode bestätigt. Die nextString
Methode akzeptiert maskierte einfache Anführungszeichen und behandelt sie wie doppelte Anführungszeichen:
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
Am Anfang der Methode steht ein informativer Kommentar:
Das formale JSON-Format erlaubt keine Zeichenfolgen in einfachen Anführungszeichen, aber eine Implementierung kann sie akzeptieren.
Einige Implementierungen akzeptieren also einfache Anführungszeichen - aber Sie sollten sich nicht darauf verlassen. Viele gängige Implementierungen sind in dieser Hinsicht recht restriktiv und lehnen JSON ab, das Zeichenfolgen in einfachen Anführungszeichen und / oder einfache Anführungszeichen enthält.
Um dies mit der ursprünglichen Frage jQuery.parseJSON
zu verknüpfen , versuchen Sie zunächst, den nativen JSON-Parser des Browsers oder gegebenenfalls eine geladene Bibliothek wie json2.js zu verwenden (auf einer Randnotiz steht die Bibliothek, auf der die jQuery-Logik basiert, wenn sie JSON
nicht definiert ist). . Daher kann jQuery nur so tolerant sein wie die zugrunde liegende Implementierung:
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
Soweit ich weiß, entsprechen diese Implementierungen nur der offiziellen JSON-Spezifikation und akzeptieren keine einfachen Anführungszeichen, daher auch nicht jQuery.
Any character may be escaped
, dies könnte erklären, warum bei einigen Implementierungen einfache Anführungszeichen maskiert werden könnten.\'
immer noch nicht zulässig. Es wäre schön, wenn der RFC in diesem Punkt expliziter wäre.Wenn Sie ein einfaches Anführungszeichen innerhalb einer Zeichenfolge benötigen, da \ 'durch die Spezifikation nicht definiert ist, verwenden
\u0027
Sie für alle die Angabe http://www.utf8-chartable.de/edit: bitte entschuldige meinen missbrauch des wortes backticks in den kommentaren. Ich meinte Backslash. Mein Punkt hier ist, dass es für den Fall, dass Sie Zeichenfolgen in anderen Zeichenfolgen verschachtelt haben, nützlicher und lesbarer sein kann, Unicode anstelle vieler Backslashes zu verwenden, um einem einzelnen Anführungszeichen zu entgehen. Wenn Sie jedoch nicht verschachtelt sind, ist es wirklich einfacher, einfach ein altes Zitat einzufügen.
quelle
var jsonEncodedAsString = <?= json_encode(myEncodedJson) ?>
demmyEncodedJson
das Ergebnis eines vorherigenjson_encode
Anführungszeichens liegt. Damit wird sichergestellt, dass kein einfaches Anführungszeichen angezeigt wird. Es wird lediglich eine große Zeichenfolge ausgegeben, die in doppelte Anführungszeichen eingeschlossen ist, sodass einfache Anführungszeichen nicht maskiert werden, sondern doppelte Anführungszeichen werden.Ich verstehe, wo das Problem liegt, und wenn ich mir die Spezifikationen ansehe, ist klar, dass uneingeschränkte einfache Anführungszeichen korrekt analysiert werden sollten.
Ich verwende die jQuery.parseJSON-Funktion von jquery, um die JSON-Zeichenfolge zu analysieren, erhalte aber immer noch den Analysefehler, wenn die mit json_encode vorbereiteten Daten ein einfaches Anführungszeichen enthalten.
Könnte es ein Fehler in meiner Implementierung sein, der so aussieht (PHP - Serverseite):
Der letzte Schritt ist, dass ich die JSON-codierte Zeichenfolge in einer JS-Variablen speichere:
Wenn ich "" anstelle von '' verwende, wird immer noch ein Fehler ausgegeben.
LÖSUNG:
Das einzige, was für mich funktioniert hat, war die Verwendung der Bitmaske JSON_HEX_APOS, um die einfachen Anführungszeichen wie folgt zu konvertieren:
Gibt es eine andere Möglichkeit, dieses Problem anzugehen? Ist mein Code falsch oder schlecht geschrieben?
Vielen Dank
quelle
Wenn Sie ein einzelnes Angebot in einer Abfrage senden
Wenn Sie den Wert einschließlich eines einfachen Anführungszeichens erhalten
Wenn Sie den Wert suchen / einfügen möchten, der ein einfaches Anführungszeichen in einer Abfrage enthält
xxx=Replace(empid,"'","''")
quelle
Ein ähnliches Problem mit CakePHP zur Ausgabe eines JavaScript-Skriptblocks mit PHPs native
json_encode
.$contractorCompanies
enthält Werte mit einfachen Anführungszeichen und wird, wie oben erläutert und erwartetjson_encode($contractorCompanies)
, nicht ausgeblendet, da es sich um einen gültigen JSON handelt.Durch Hinzufügen von addslashes () um die JSON-codierte Zeichenfolge werden die Anführungszeichen entfernt, sodass Cake / PHP das richtige Javascript an den Browser zurücksenden kann. JS-Fehler verschwinden.
quelle
Ich habe versucht, ein JSON-Objekt aus einer XHR-Anforderung in einem HTML5-Daten- * -Attribut zu speichern. Ich habe viele der oben genannten Lösungen ohne Erfolg ausprobiert.
Am Ende habe ich das einfache Anführungszeichen
'
durch'
den regulären Code durch einen regulären Ausdruck ersetzt, nachdem die Methode stringify () Folgendes aufgerufen hat:quelle
Interessant. Wie generieren Sie Ihren JSON auf der Serverseite? Verwenden Sie eine Bibliotheksfunktion (z. B.
json_encode
in PHP) oder erstellen Sie die JSON-Zeichenfolge von Hand?Das einzige, was meine Aufmerksamkeit auf sich zieht, ist der Fluchtapostroph (
\'
). Da Sie doppelte Anführungszeichen verwenden, wie Sie es tatsächlich sollten, müssen Sie sich einfachen Anführungszeichen nicht entziehen. Ich kann nicht überprüfen, ob dies tatsächlich die Ursache für Ihren jQuery-Fehler ist, da ich selbst noch nicht auf Version 1.4.1 aktualisiert habe.quelle