Come sfuggire a una stringa JSON contenente caratteri di nuova riga utilizzando JavaScript?

Devo formare una stringa JSON in cui un valore sta avendo un carattere di nuova riga. Questo deve essere sfuggito e quindi pubblicato utilizzando la chiamata AJAX. Qualcuno può suggerire un modo per sfuggire alla stringa con JavaScript. Non sto usando jQuery.

Prendi il tuo JSON e .stringify() esso. Quindi usa il metodo .replace() e sostituisci tutte le occorrenze di \n con \\n .

MODIFICARE:

Per quanto ne so, non ci sono librerie JS conosciute per l’escape di tutti i caratteri speciali in una stringa. Tuttavia, puoi concatenare il metodo .replace() e sostituire tutti i caratteri speciali come questo:

 var myJSONString = JSON.stringify(myJSON); var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n") .replace(/\\'/g, "\\'") .replace(/\\"/g, '\\"') .replace(/\\&/g, "\\&") .replace(/\\r/g, "\\r") .replace(/\\t/g, "\\t") .replace(/\\b/g, "\\b") .replace(/\\f/g, "\\f"); // myEscapedJSONString is now ready to be POST'ed to the server. 

Ma è piuttosto brutto, vero? Inserisci la bellezza delle funzioni, in quanto ti permettono di rompere il codice in pezzi e mantenere pulito il stream principale del tuo script, e libero da 8 chiamate .replace() concatenate. Quindi mettiamo quella funzionalità in una funzione chiamata, escapeSpecialChars() . Andiamo avanti e collegalo alla prototype chain di prototype chain dell’object String , così possiamo chiamare escapeSpecialChars() direttamente sugli oggetti String.

Così:

 String.prototype.escapeSpecialChars = function() { return this.replace(/\\n/g, "\\n") .replace(/\\'/g, "\\'") .replace(/\\"/g, '\\"') .replace(/\\&/g, "\\&") .replace(/\\r/g, "\\r") .replace(/\\t/g, "\\t") .replace(/\\b/g, "\\b") .replace(/\\f/g, "\\f"); }; 

Una volta definita questa funzione, il corpo principale del nostro codice è semplice come questo:

 var myJSONString = JSON.stringify(myJSON); var myEscapedJSONString = myJSONString.escapeSpecialChars(); // myEscapedJSONString is now ready to be POST'ed to the server 

Come suggerito dall’utente667073, eccetto riordinare prima la sostituzione della barra inversa e correggere la sostituzione della quota

 escape = function (str) { return str .replace(/[\\]/g, '\\\\') .replace(/[\"]/g, '\\\"') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t'); }; 

Come te, ho cercato diversi commenti e post per sostituire i caratteri speciali di escape nel mio JSON che contiene oggetti html al loro interno.

Il mio objective è quello di rimuovere i caratteri speciali nell’object JSON e anche il rendering dell’html che si trova all’interno dell’object json.

Ecco cosa ho fatto e spero che sia molto semplice da usare.

Prima ho fatto JSON.stringify il mio json object e JSON.parse il risultato.

Ad esempio:

 JSON.parse(JSON.stringify(jsonObject)); 

E risolve il mio problema e ho fatto usando Pure Javascript.

Ho paura di dire che la risposta data da Alex è piuttosto scorretta, per usare un eufemismo:

  • Alcuni personaggi che Alex cerca di fuggire non sono obbligati a fuggire (come & e ‘);
  • \ b non è affatto il carattere di backspace ma piuttosto una corrispondenza di limite di parole
  • I caratteri che devono essere salvati non vengono gestiti.

Questa funzione

 escape = function (str) { // TODO: escape %x75 4HEXDIG ?? chars return str .replace(/[\"]/g, '\\"') .replace(/[\\]/g, '\\\\') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t') ; }; 

sembra essere una migliore approssimazione.

Un piccolo aggiornamento per le virgolette singole

 function escape (key, val) { if (typeof(val)!="string") return val; return val .replace(/[\\]/g, '\\\\') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t') .replace(/[\"]/g, '\\"') .replace(/\\'/g, "\\'"); } var myJSONString = JSON.stringify(myJSON,escape); 

questo è un vecchio post. ma potrebbe comunque essere utile per chi usa angular.fromJson e JSON.stringify. escape () è deprecato. usa questo invece,

 var uri_enc = encodeURIComponent(uri); //before you post the contents var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents. 

ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

C’è anche un secondo parametro su JSON.stringify. Quindi, una soluzione più elegante sarebbe:

 function escape (key, val) { if (typeof(val)!="string") return val; return val .replace(/[\"]/g, '\\"') .replace(/[\\]/g, '\\\\') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t') ; } var myJSONString = JSON.stringify(myJSON,escape); 

Questa è una vecchia domanda, ma la soluzione non ha funzionato bene perché non ha risolto tutti i casi. Alla fine ho trovato una risposta che ha fatto il lavoro qui

Pubblicherò la mia soluzione combinata di entrambi usando il componente uri di escape e encode:

 // implement JSON stringify serialization JSON.stringify = JSON.stringify || function (obj) { var t = typeof (obj); if (t != "object" || obj === null) { // simple data type if (t == "string") obj = '"'+obj+'"'; return String(obj); } else { // recurse array or object var n, v, json = [], arr = (obj && obj.constructor == Array); for (n in obj) { v = obj[n]; t = typeof(v); if (t == "string") v = '"'+v+'"'; else if (t == "object" && v !== null) v = JSON.stringify(v); json.push((arr ? "" : '"' + n + '":') + String(v)); } var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); return rawString; } }; function escape (key, val) { if (typeof(val)!="string") return val; var replaced = encodeURIComponent(val); return replaced; } JSON.stringifyEscaped = function(obj){ return JSON.stringify(obj,escape); } 

Ho avuto la stessa situazione in una delle mie chiamate Ajax, in cui JSON stava lanciando un errore a causa della nuova riga nel campo Textarea. La soluzione fornita qui non ha funzionato per me. Quindi ho usato la funzione .escape di Javascript e ha funzionato bene. Quindi, per recuperare il valore da JSON , ho semplicemente .unescape usando .unescape .

Quando si utilizza qualsiasi forma di Ajax, la documentazione dettagliata per il formato delle risposte ricevute dal server CGI sembra mancare sul Web. Alcune voci sottolineano che le newline nel testo restituito o nei dati json devono essere sottoposte a escape per impedire loop infiniti (hang) nella conversione JSON (probabilmente creata generando un’eccezione non rilevata), sia eseguita automaticamente da jQuery o manualmente utilizzando il sistema Javascript o l’analisi JSON della libreria chiamate.

In ogni caso in cui i programmatori pubblicano questo problema, vengono presentate soluzioni inadeguate (spesso sostituendo \ n con \\ n dal lato dell’invio) e la questione viene abbandonata. La loro inadeguatezza viene rivelata quando si passano valori di stringa che incorporano accidentalmente sequenze di escape di controllo, come i nomi di percorso di Windows. Un esempio è “C: \ Chris \ Roberts.php”, che contiene i caratteri di controllo ^ c e ^ r, che possono causare la conversione JSON della stringa {“file”: “C: \ Chris \ Roberts.php”} a loop per sempre. Un modo per generare tali valori è deliberatamente quello di tentare di passare avvertimenti e messaggi di errore PHP dal server al client, un’idea ragionevole.

Per definizione, Ajax utilizza connessioni HTTP dietro le quinte. Tali connessioni passano i dati utilizzando GET e POST, che richiedono entrambi la codifica dei dati inviati per evitare una syntax errata, inclusi i caratteri di controllo.

Questo fornisce un suggerimento sufficiente per build quella che sembra essere una soluzione (ha bisogno di più test): utilizzare rawurlencode sul lato PHP (invio) per codificare i dati e decifrarli sul lato Javascript (di ricezione) per decodificare i dati. In alcuni casi, le applicherai a intere stringhe di testo, in altri casi le applicherai solo ai valori all’interno di JSON.

Se questa idea risulta corretta, possono essere costruiti semplici esempi per aiutare i programmatori di tutti i livelli a risolvere questo problema una volta per tutte.

usa json_encode () se il tuo lang scripting sul lato server è php, json_encode () sfugge al newline e altri token inaspettati per te (se non php cerca una funzione simile per la tua lan di scripting)

quindi usa $ .parseJSON () nel tuo javascript, fatto!

Ho usato il built in jQuery.serialize () per estrarre il valore da una textarea per urlencode l’input. La parte pro è che non devi cercare di sostituire ogni carattere speciale per conto tuo e io tengo anche le newline e fugge html. Per serializzare al lavoro sembra che il campo di input debba avere un attributo di nome e aggiunge anche lo stesso attributo alla stringa di escape che deve essere rimossa. Potrebbe non essere quello che stai cercando, ma funziona per me.

 var myinputfield = jQuery("#myinputfield"); var text = myinputfield.serialize(); text = text.replace(myinputfield.attr('name') + '=',''); 

Sembra che questo sia un post antico in realtà 🙂 Ma ragazzi, la soluzione migliore che ho per questo, essere al 100% che funzioni senza codice complicato, è usare entrambe le funzioni di codifica / decodifica in base64. Questi sono atob () e btoa (). Di gran lunga il modo più semplice e migliore, non c’è bisogno di preoccuparsi se si è perso qualsiasi personaggio da sfuggire.

Giorgio