Как избежать строки JSON, чтобы иметь ее в URL-адресе?
используя Javascript, я хочу создать ссылку на страницу. Параметры страницы находятся в массиве Javascript, который я сериализую в JSON.
поэтому я хотел бы создать такой URL:
http://example.com/?data="MY_JSON_ARRAY_HERE"
как мне нужно экранировать строку JSON (сериализованный массив), чтобы включить ее в качестве параметра в URL-адрес ?
Если есть решение с использованием JQuery, мне бы это понравилось.
Примечание: да, параметры страницы должны быть в массив, потому что их очень много. Я думаю, что буду использовать bit.ly чтобы сократить ссылки после этого.
6 ответов:
можно использовать
encodeURIComponent
чтобы безопасно URL-адрес кодировать части строки запроса:var array = JSON.stringify([ 'foo', 'bar' ]); var url = 'http://example.com/?data=' + encodeURIComponent(array);
или если вы отправляете это как запрос AJAX:
var array = JSON.stringify([ 'foo', 'bar' ]); $.ajax({ url: 'http://example.com/', type: 'GET', data: { data: array }, success: function(result) { // process the results } });
Я хотел сделать то же самое. проблема для меня заключалась в том, что мой url-адрес становился слишком длинным. Я нашел решение сегодня с помощью Bruno Jouhier's jsUrl.библиотека js.
Я еще не проверил его очень тщательно. Однако вот пример, показывающий длины символов строки, выводимой после кодирования одного и того же большого объекта с использованием 3 различных методов:
- 2651 знаков с помощью
jQuery.param
- 1691 символов с помощью
JSON.stringify + encodeURIComponent
- 821 знаков с помощью
JSURL.stringify
очевидно, что JSURL имеет наиболее оптимизированный формат для urlEncoding объекта js.
поток в https://groups.google.com/forum/?fromgroups=#! topic / nodejs / ivdZuGCF86Q показывает тесты для кодирования и синтаксического анализа.
Примечание: после тестирования он выглядит как jsurl.библиотека js использует функции ECMAScript 5, такие как Object.ключи, массив.карта и массив.фильтр. Следовательно, он будет работать только на современных браузерах (не IE 8 и ниже). Однако, полифиллы для этих функций, что бы обеспечить его совместимость с большим количеством браузеров.
- для массива:https://stackoverflow.com/a/2790686/467286
- для объекта.ключи: https://stackoverflow.com/a/3937321/467286
используя
encodeURIComponent()
:var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),
Я предложу странную альтернативу. Иногда проще использовать другую кодировку, особенно если вы имеете дело с различными системами, которые не все обрабатывают детали кодирования URL одинаково. Это не самый распространенный подход, но может пригодиться в определенных ситуациях.
вместо URL-кодирования данных, вы можете base64-кодировать его. Преимуществом этого является то, что закодированные данные очень общие, состоящие только из Альфа-символов, а иногда и трейлинг
=
'ы. Пример:массив строк JSON:
["option", "Fred's dog", "Bill & Trudy", "param=3"]
эти данные, URL-кодируются как
data
param:"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D"
то же самое, base64-encoded:
"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"
подход base64 может быть немного короче, но что более важно, он проще. У меня часто возникают проблемы с перемещением URL-кодированных данных между cURL, веб-браузерами и другими клиентами, обычно из-за кавычек, встроенных
%
знаки и так далее. Base64 очень нейтрален, потому что он не использует специальные письмена.
ответ, данный Деланом, идеален. Просто добавьте к нему-если кто - то хочет назвать параметры или передать несколько строк JSON отдельно-приведенный ниже код может помочь!
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')));
надеюсь, что это помогает!