¿Cómo escapar una cadena JSON para tenerla en una URL?


Usando Javascript, quiero generar un enlace a una página. Los parámetros de la página están en una matriz Javascript que serializo en JSON.

Así que me gustaría generar una URL como esa:

http://example.com/?data="MY_JSON_ARRAY_HERE"

¿Cómo necesito escapar mi cadena JSON (matriz serializada) para incluirla como parámetro en una URL ?

Si hay una solución usando jQuery me encantaría.

Nota: Sí, los parámetros de la página deben estar en una matriz porque hay muchos de ellos. Me creo que usaré bit.ly para acortar los enlaces después.

Author: Matthieu Napoli, 2011-07-24

6 answers

encodeURIComponent(JSON.stringify(object_to_be_serialised))
 184
Author: Delan Azabani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-24 13:55:03

Usted podría utilizar el encodeURIComponent para codificar de forma segura las partes de una cadena de consulta:

var array = JSON.stringify([ 'foo', 'bar' ]);
var url = 'http://example.com/?data=' + encodeURIComponent(array);

O si está enviando esto como una solicitud AJAX:

var array = JSON.stringify([ 'foo', 'bar' ]);
$.ajax({
    url: 'http://example.com/',
    type: 'GET',
    data: { data: array },
    success: function(result) {
        // process the results
    }
});
 18
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-24 13:55:37

Yo estaba buscando hacer lo mismo. el problema para mí era que mi url se estaba volviendo demasiado larga. Encontré una solución hoy usando jsUrl de Bruno Jouhier.js library .

Todavía no lo he probado a fondo. Sin embargo, aquí hay un ejemplo que muestra las longitudes de caracteres de la salida de cadena después de codificar el mismo objeto grande utilizando 3 métodos diferentes:

  • 2651 caracteres usando jQuery.param
  • 1691 caracteres usando JSON.stringify + encodeURIComponent
  • 821 caracteres usando JSURL.stringify

Claramente JSURL tiene el formato más optimizado para la codificación URL de un objeto js.

El hilo en https://groups.google.com/forum/?fromgroups=#! topic / nodejs / ivdZuGCF86Q muestra puntos de referencia para la codificación y el análisis.

Nota : Después de probar, se parece a jsurl.la biblioteca js utiliza funciones ECMAScript 5 como Object.llaves, Matriz.mapa y Matriz.filtro. Por lo tanto, solo funcionará en navegadores modernos (no ie 8 y menores). Sin embargo, son polyfills para estas funciones lo harían compatible con más navegadores.

 16
Author: jcj80,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:32

Usando encodeURIComponent():

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),
 6
Author: genesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-13 01:12:33

Voy a ofrecer una alternativa extraña. A veces es más fácil usar una codificación diferente, especialmente si se trata de una variedad de sistemas que no todos manejan los detalles de la codificación de URL de la misma manera. Este no es el enfoque más convencional, pero puede ser útil en ciertas situaciones.

En lugar de codificar los datos con URL, puede codificarlos con base64. El beneficio de esto es que los datos codificados son muy genéricos, que consisten solo en caracteres alfa y a veces se arrastran ='s. Ejemplo:

JSON array-of-strings:

["option", "Fred's dog", "Bill & Trudy", "param=3"]

Esos datos, codificados en URL como el data parámetro:

"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D"

Mismo, codificado en base64:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

El enfoque base64 puede ser un poco más corto, pero lo más importante es que es más simple. A menudo tengo problemas para mover datos codificados por URL entre cURL, navegadores web y otros clientes, generalmente debido a comillas, signos incrustados % y así sucesivamente. Base64 es muy neutral porque no usa caracteres especiales.

 3
Author: Chris Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-01 13:50:50

La respuesta dada por Delan es perfecta. Simplemente añadiendo a él-en caso de que alguien quiera nombrar los parámetros o pasar varias cadenas JSON por separado - el siguiente código podría ayudar!

[2]} jQuery
var valuesToPass = new Array(encodeURIComponent(VALUE_1), encodeURIComponent(VALUE_2), encodeURIComponent(VALUE_3), encodeURIComponent(VALUE_4));

data = {elements:JSON.stringify(valuesToPass)}

PHP

json_decode(urldecode($_POST('elements')));

Espero que esto ayude!

 0
Author: foxybagga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-30 07:12:11