Ich muss eine JSON-Zeichenfolge bilden, in der ein Wert ein neues Zeilenzeichen hat. Dies muss maskiert und dann mit einem AJAX-Aufruf gebucht werden. Kann jemand einen Weg vorschlagen, um die Zeichenfolge mit JavaScript zu entkommen. Ich verwende jQuery nicht.
javascript
escaping
Srikant
quelle
quelle
Antworten:
Nehmen Sie Ihren JSON und
.stringify()
es. Verwenden Sie dann die.replace()
Methode und ersetzen Sie alle Vorkommen von\n
durch\\n
.BEARBEITEN:
Soweit mir bekannt ist, gibt es keine bekannten JS-Bibliotheken, um alle Sonderzeichen in einer Zeichenfolge zu maskieren. Sie können die
.replace()
Methode jedoch verketten und alle Sonderzeichen wie folgt ersetzen:Aber das ist ziemlich böse, nicht wahr? Geben Sie die Schönheit von Funktionen ein, indem Sie damit Code in Teile zerlegen und den Hauptfluss Ihres Skripts sauber und frei von 8 verketteten
.replace()
Aufrufen halten können. Lassen Sie uns diese Funktionalität in eine Funktion namens ,escapeSpecialChars()
. Fahren wir fort und hängen Sie es an dieprototype chain
desString
Objekts, also nennen wir könnenescapeSpecialChars()
direkt auf String - Objekte.Wie so:
Sobald wir diese Funktion definiert haben, ist der Hauptteil unseres Codes so einfach:
quelle
Wie vom Benutzer 667073 vorgeschlagen, außer dass zuerst der Backslash-Ersatz neu angeordnet und der Angebotsersatz korrigiert wird
quelle
Line separator
\u2028
undParagraph separator
\u2029
. Ref: es5.github.io/#x7.3Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Wie Sie habe ich mehrere Kommentare und Beiträge untersucht, um spezielle Escape-Zeichen in meinem JSON zu ersetzen, das darin ein HTML-Objekt enthält.
Mein Ziel ist es, die Sonderzeichen im JSON-Objekt zu entfernen und auch das HTML zu rendern, das sich im json-Objekt befindet.
Hier ist, was ich getan habe und hoffe, dass es sehr einfach zu bedienen ist.
Zuerst habe ich JSON.stringify für mein json-Objekt und JSON.parse das Ergebnis erstellt.
Zum Beispiel:
Und es löst mein Problem und erledigt mit Pure Javascript.
quelle
stackoverflow
FehlerJSON.parse(JSON.stringify($("body")))
in einer HTML-Datei mit Body und einigen Tabellen. $ ("body") ist ein Javascript-Objekt, aber stringify schlägt beim Parsen fehl.Ich habe Angst zu sagen, dass die Antwort von Alex ziemlich falsch ist, um es milde auszudrücken:
Diese Funktion
scheint eine bessere Annäherung zu sein.
quelle
Ein kleines Update für einfache Anführungszeichen
quelle
Dies ist ein alter Beitrag. Es kann jedoch weiterhin hilfreich sein, wenn Sie angle.fromJson und JSON.stringify verwenden. Escape () ist veraltet. Verwenden Sie dies stattdessen,
ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
quelle
Es gibt auch einen zweiten Parameter in JSON.stringify. Eine elegantere Lösung wäre also:
quelle
Dies ist eine alte Frage, aber die Lösung hat bei mir nicht gut funktioniert, da sie nicht alle Fälle gelöst hat. Ich habe endlich eine Antwort gefunden, die hier funktioniert hat
Ich werde meine kombinierte Lösung aus Escape und Codierung der Uri-Komponente veröffentlichen:
quelle
escape = (string) -> JSON.stringify(string)[1...-1]
Es ist besser zu benutzen
JSON.parse(yourUnescapedJson);
quelle
Verwenden Sie json_encode (), wenn Ihre serverseitige Skriptsprache PHP ist,
json_encode()
der Zeilenumbruch und andere unerwartete Token für Sie nicht angezeigt werden ( wenn Sie PHP nicht verwenden, suchen Sie nach ähnlichen Funktionen für Ihre Skriptsprache).dann
$.parseJSON()
in deinem JavaScript verwenden, fertig!quelle
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
php JSON.parse DoppelcodierungIch habe die gleiche Situation bei einem meiner Ajax-Aufrufe erhalten, bei dem
JSON
aufgrund der neuen Zeile im Feld Textarea ein Fehler aufgetreten ist. Die hier angegebene Lösung hat bei mir nicht funktioniert. Also habe ich die.escape
Funktion von Javascript verwendet und es hat gut funktioniert.JSON
Um dann den Wert von abzurufen , habe ich einfach mit entkommen.unescape
.quelle
Ich habe das eingebaute jQuery.serialize () verwendet , um den Wert aus einem Textbereich zu extrahieren und die Eingabe zu urlencodieren. Der Pro-Teil ist, dass Sie nicht suchen müssen, um jedes Sonderzeichen selbst zu ersetzen, und ich behalte auch die Zeilenumbrüche und entkomme HTML. Damit die Serialisierung funktioniert, muss das Eingabefeld anscheinend ein Namensattribut haben, und es fügt der Escapezeichenfolge, die ersetzt werden muss, dasselbe Attribut hinzu. Könnte nicht das sein, wonach Sie suchen, aber es funktioniert für mich.
quelle
Bei Verwendung einer beliebigen Form von Ajax scheint im Web eine detaillierte Dokumentation zum Format der vom CGI-Server empfangenen Antworten zu fehlen. Einige Einträge hier weisen darauf hin, dass Zeilenumbrüche in zurückgegebenen Text- oder JSON-Daten maskiert werden müssen, um Endlosschleifen (Hangs) bei der JSON-Konvertierung (möglicherweise durch Auslösen einer nicht erfassten Ausnahme) zu verhindern, unabhängig davon, ob dies automatisch durch jQuery oder manuell mithilfe des JSON-Parsing des Javascript-Systems oder der Bibliothek erfolgt Anrufe.
In jedem Fall, in dem Programmierer dieses Problem veröffentlichen, werden unzureichende Lösungen vorgestellt (meistens wird \ n auf der sendenden Seite durch \\ n ersetzt), und die Angelegenheit wird verworfen. Ihre Unzulänglichkeit wird beim Übergeben von Zeichenfolgenwerten aufgedeckt, in die versehentlich Steuerelement-Escape-Sequenzen eingebettet sind, z. B. Windows-Pfadnamen. Ein Beispiel ist "C: \ Chris \ Roberts.php", das die Steuerzeichen ^ c und ^ r enthält, was zu einer JSON-Konvertierung der Zeichenfolge {"file": "C: \ Chris \ Roberts.php"} in führen kann Schleife für immer. Eine Möglichkeit, solche Werte zu generieren, besteht darin, absichtlich zu versuchen, PHP-Warnungen und Fehlermeldungen vom Server an den Client zu übergeben. Dies ist eine vernünftige Idee.
Per Definition verwendet Ajax hinter den Kulissen HTTP-Verbindungen. Solche Verbindungen übertragen Daten mithilfe von GET und POST. Beide erfordern die Codierung der gesendeten Daten, um eine falsche Syntax einschließlich Steuerzeichen zu vermeiden.
Dies gibt genug Hinweise, um eine Lösung zu konstruieren (es müssen weitere Tests durchgeführt werden): Verwenden Sie Rawurlencode auf der PHP-Seite (Senden), um die Daten zu codieren, und Entweichen auf der Javascript-Seite (Empfangen), um die Daten zu decodieren. In einigen Fällen wenden Sie diese auf ganze Textzeichenfolgen an, in anderen Fällen wenden Sie sie nur auf Werte in JSON an.
Wenn sich diese Idee als richtig herausstellt, können einfache Beispiele erstellt werden, die Programmierern auf allen Ebenen helfen, dieses Problem ein für alle Mal zu lösen.
quelle
Sieht so aus, als wäre dies wirklich ein alter Beitrag :-) Aber Leute, die beste Lösung, die ich dafür habe, um 100% zu sein, dass es ohne komplizierten Code funktioniert, besteht darin, beide Funktionen des Codierens / Decodierens für base64 zu verwenden. Dies sind atob () und btoa (). Bei weitem der einfachste und beste Weg, keine Sorge zu machen, wenn Sie irgendwelche Charaktere verpasst haben, denen Sie entkommen können.
George
quelle
Wenn Ihre Googles Sie weiterhin hier landen und Ihre API Fehler auslöst, es sei denn, Ihre JSON-Anführungszeichen werden
"{\"foo\": true}"
maskiert ( ), müssen Sie nur zweimal stringifizieren, zJSON.stringify(JSON.stringify(bar))
quelle
Verwenden Sie encodeURIComponent (), um die Zeichenfolge zu codieren.
Z.B. var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));
Sie müssen es nicht dekodieren, da der Webserver automatisch dasselbe tut.
quelle
Verwenden Sie niemals reguläre Ausdrücke (ich meine wie nie zuvor). Der beste und effektivste Weg:
quelle