unescape special single escape characters javascript escaping

special - ¿Cómo escapar de una cadena JSON que contenga caracteres de nueva línea usando JavaScript?



javascript special characters unicode (13)

Tengo que formar una cadena JSON en la que un valor tenga un nuevo carácter de línea. Esto tiene que ser escapado y luego publicado usando la llamada AJAX. ¿Alguien puede sugerir una forma de escapar de la cadena con JavaScript? No estoy usando jQuery.


Al igual que usted, he estado investigando varios comentarios y publicaciones para reemplazar caracteres de escape especiales en mi JSON que contiene un objeto html dentro de eso.

Mi objetivo es eliminar los caracteres especiales en el objeto JSON y también renderizar el html que está dentro del objeto json.

Esto es lo que hice y espero que sea muy simple de usar.

Primero hice JSON.stringify mi objeto json y JSON.parse el resultado.

Por ejemplo:

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

Y soluciona mi problema y lo hace usando Pure Javascript.


Cuando se usa cualquier forma de Ajax, parece que en la Web falta documentación detallada sobre el formato de las respuestas recibidas del servidor CGI. Algunas entradas señalan que las líneas nuevas en datos de texto o json deben escaparse para evitar bucles infinitos (bloqueos) en la conversión JSON (posiblemente creada lanzando una excepción no detectada), ya sea que se realicen automáticamente mediante jQuery o manualmente mediante el sistema Javascript o la biblioteca Análisis JSON llamadas.

En cada caso en que los programadores publiquen este problema, se presentan soluciones inadecuadas (la mayoría de las veces reemplazando / n por // n en el lado de envío) y el asunto se descarta. Su inadecuación se revela cuando se pasan valores de cadena que incorporan accidentalmente secuencias de escape de control, como los nombres de las rutas de Windows. Un ejemplo es "C: / Chris / Roberts.php", que contiene los caracteres de control ^ c y ^ r, que pueden causar la conversión JSON de la cadena {"archivo": "C: / Chris / Roberts.php"} a lazo por siempre Una forma de generar dichos valores es deliberadamente intentar pasar mensajes de advertencia y error PHP de servidor a cliente, una idea razonable.

Por definición, Ajax usa conexiones HTTP detrás de escena. Estas conexiones pasan datos usando GET y POST, y ambos requieren codificación de los datos enviados para evitar la sintaxis incorrecta, incluidos los caracteres de control.

Esto proporciona una pista suficiente para construir lo que parece ser una solución (necesita más pruebas): usar rawurlencode en el lado PHP (envío) para codificar los datos, y unescape en el lado Javascript (recepción) para decodificar los datos. En algunos casos, los aplicará a cadenas de texto enteras, en otros casos los aplicará solo a valores dentro de JSON.

Si esta idea resulta ser correcta, se pueden construir ejemplos simples para ayudar a los programadores de todos los niveles a resolver este problema de una vez por todas.


De acuerdo con el usuario667073 sugerido, salvo que se reordene primero la sustitución de la barra diagonal inversa y se repare el reemplazo de la cotización

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''); };


Esta es una publicación vieja. pero aún puede ser útil para quienes usan angular.fromJson y JSON.stringify. escape () está en desuso. usa esto en cambio,

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


Esta es una vieja pregunta, pero la solución no me funcionó, ya que no resolvió todos los casos. Finalmente encontré una respuesta que hizo el trabajo here

Voy a publicar mi solución combinada de ambos usando escape y codificar el componente uri:

// 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); }


Obtuve la misma situación en una de mis llamadas a Ajax, donde JSON arrojaba un error debido a la nueva línea en el campo Textarea. La solución dada aquí no funcionó para mí. Así que utilicé la función .escape de Javascript y funcionó bien. Luego, para recuperar el valor de JSON , simplemente lo .unescape usando .unescape .


Parece que esta es una publicación antigua realmente :-) Pero chicos, la mejor solución que tengo para esto, que sea 100% que funciona sin código complicado, es usar ambas funciones de codificación / descodificación para base64. Estos son atob () y btoa (). Con mucho, la mejor y más fácil manera, no hay necesidad de preocuparse si se ha perdido algún personaje del que escaparse.

Jorge


También hay un segundo parámetro en JSON.stringify. Entonces, una solución más elegante sería:

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


Tengo miedo de decir que la respuesta dada por Alex es bastante incorrecta, por decirlo suavemente:

  • Algunos personajes que Alex trata de escapar no necesitan escapar (como & y '');
  • / b no es para nada el carácter de retroceso, sino más bien una coincidencia de límite de palabras
  • Los caracteres que deben escaparse no se manejan.

Esta función

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'') ; };

parece ser una mejor aproximación.


Una pequeña actualización para comillas simples

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


use json_encode () si su lang scripting del lado del servidor es php, json_encode () escapa de la línea nueva y otros tokens inesperados (si no es php busque una función similar para su lanzador de scripts)

luego usa $ .parseJSON () en tu javascript, hecho!


jQuery.serialize() el built in jQuery.serialize() para extraer el valor de un textarea a urlencode la entrada. La parte pro es que no tiene que buscar reemplazar cada char especial por su cuenta y también guardo las líneas nuevas y escapa html. Para serializar para funcionar, parece que el campo de entrada necesita tener un atributo de nombre y también agrega el mismo atributo a la cadena escapada que necesita ser reemplazada. Puede que no sea lo que estás buscando pero funciona para mí.

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


Tome su JSON y .stringify() . Luego use el método .replace() y reemplace todas las ocurrencias de /n con //n .

EDITAR:

Por lo que yo sé, no hay bibliotecas conocidas de JS para escapar de todos los caracteres especiales en una cadena. Pero, puedes encadenar el método .replace() y reemplazar todos los caracteres especiales como este:

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.

Pero eso es bastante desagradable, ¿no? Introduzca la belleza de las funciones, ya que le permiten dividir el código en partes y mantener el flujo principal de su script limpio, y libre de 8 llamadas .replace() encadenadas. Así que vamos a poner esa funcionalidad en una función llamada, escapeSpecialChars() . escapeSpecialChars() a la prototype chain del objeto String , de modo que podamos llamar a escapeSpecialChars() directamente en objetos String.

Al igual que:

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 vez que hemos definido esa función, el cuerpo principal de nuestro código es tan simple como esto:

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