Как избежать JSON-строки, чтобы она была в URL?

javascript jquery json url escaping

153559 просмотра

6 ответа

26646 Репутация автора

Используя Javascript, я хочу создать ссылку на страницу. Параметры страницы находятся в массиве Javascript, который я сериализую в JSON.

Поэтому я хотел бы создать URL-адрес, например:

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

Как мне нужно экранировать мою строку JSON (сериализованный массив), чтобы включить ее в качестве параметра в URL?

Если есть решение с использованием JQuery, я бы с удовольствием.

Примечание: Да, параметры страницы должны быть в массиве, потому что их много. Я думаю, что я буду использовать bit.ly, чтобы сократить ссылки потом.

Автор: Matthieu Napoli Источник Размещён: 24.07.2011 01:53

Ответы (6)


202 плюса

63850 Репутация автора

Решение
encodeURIComponent(JSON.stringify(object_to_be_serialised))
Автор: Delan Azabani Размещён: 24.07.2011 01:55

8 плюса

44852 Репутация автора

Использование encodeURIComponent():

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),
Автор: genesis Размещён: 24.07.2011 01:55

18 плюса

884730 Репутация автора

Вы можете использовать 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
    }
});
Автор: Darin Dimitrov Размещён: 24.07.2011 01:55

0 плюса

3772 Репутация автора

Ответ, данный Деланом, идеален. Просто добавьте к этому - если кто-то хочет назвать параметры или передать несколько строк 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')));

Надеюсь это поможет!

Автор: foxybagga Размещён: 30.11.2012 07:12

18 плюса

421 Репутация автора

Я хотел сделать то же самое. проблема для меня была в том, что мой 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.keys, Array.map и Array.filter. Таким образом, он будет работать только в современных браузерах (нет 8 и ниже). Тем не менее, есть полифилы для этих функций, которые сделали бы его совместимым с большим количеством браузеров.

Автор: jcj80 Размещён: 19.03.2013 04:56

5 плюса

14096 Репутация автора

Я предложу странную альтернативу. Иногда проще использовать другую кодировку, особенно если вы имеете дело с различными системами, которые не все обрабатывают детали кодирования URL одинаково. Это не самый распространенный подход, но может пригодиться в определенных ситуациях.

Вместо того, чтобы URL-кодировать данные, вы можете base64-кодировать их. Преимущество этого заключается в том, что закодированные данные являются очень общими, состоящими только из буквенных символов, а иногда и конечных =. Пример:

Массив строк JSON:

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

Эти данные, URL-кодируются как dataпараметр:

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

То же, в кодировке base64:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

Подход base64 может быть немного короче, но что более важно, он проще. У меня часто возникают проблемы при перемещении данных в кодировке URL между cURL, веб-браузерами и другими клиентами, как правило, из-за кавычек, встроенных %знаков и так далее. Base64 очень нейтрален, потому что не использует специальные символы.

Автор: Chris Johnson Размещён: 01.12.2017 01:50
Вопросы из категории :
32x32