Ответ 1
encodeURIComponent(JSON.stringify(object_to_be_serialised))
Используя Javascript, я хочу создать ссылку на страницу. Параметры страницы находятся в массиве Javascript, который я сериализую в JSON.
Поэтому я хотел бы создать такой URL:
http://example.com/?data="MY_JSON_ARRAY_HERE"
Как мне избежать строки JSON (сериализованный массив), чтобы включить его в качестве параметра в URL?
Если есть решение, использующее JQuery, мне это понравится.
Примечание. Да, параметры страницы должны быть в массиве, потому что их много. Я думаю, что я буду использовать bit.ly, чтобы впоследствии сократить ссылки.
encodeURIComponent(JSON.stringify(object_to_be_serialised))
Вы можете использовать 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 jsUrl.js.
Я еще не тестировал его очень тщательно. Тем не менее, вот пример, показывающий длины символов вывода строки после кодирования одного и того же большого объекта с использованием 3 разных методов:
jQuery.param
JSON.stringify + encodeURIComponent
JSURL.stringify
ясно JSURL имеет наиболее оптимизированный формат для urlEncoding объекта js.
поток в https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q показывает тесты для кодирования и разбора.
Примечание. После тестирования выглядит так: библиотека jsurl.js использует функции ECMAScript 5, такие как Object.keys, Array.map и Array.filter. Таким образом, он будет работать только в современных браузерах (не то есть 8 и ниже). Тем не менее, это полисы для этих функций, которые сделают его совместимым с большим количеством браузеров.
Использование encodeURIComponent()
:
var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),
Ответ, заданный Деланом, прекрасен. Просто добавив к нему - если кто-то хочет назвать параметры или передать несколько строк 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')));
Надеюсь, это поможет!
Я предлагаю необычную альтернативу. Иногда проще использовать различную кодировку, особенно если вы имеете дело с различными системами, которые не все обрабатывают детали кодировки URL одинаково. Это не самый основной подход, но он может пригодиться в определенных ситуациях.
Вместо URL-кодирования данных вы можете закодировать base64. Преимущество этого заключается в том, что кодированные данные являются очень обобщенными, состоящими только из альфа-символов и иногда заканчивающихся =
. Пример:
JSON массив строк:
["option", "Fred 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 очень нейтрален, потому что он не использует специальные символы.