Як уникнути рядка JSON, щоб він був у URL-адресі?


129

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

Тому я хотів би створити таку URL-адресу:

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

Як мені потрібно уникнути мого рядка JSON (масив серіалізований), щоб включити його як параметр у URL-адресу?

Якщо є рішення, що використовує JQuery, я б його сподобався.

Примітка. Так, параметри сторінки повинні бути в масиві, оскільки їх дуже багато. Думаю, я скористаюся bit.ly, щоб згодом скоротити посилання.


Дивіться також stackoverflow.com/questions/21802866 / ...
w00t

Відповіді:


210
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
Здається, що він кодує більше символів, ніж потрібно (коли я вставляю посилання у Firefox, деякі символи повертаються назад (тобто {["). Чи є спосіб кодувати лише потрібні символи, щоб я міг скоротити свої URL-адреси?
Матьє Наполі

19

Ви можете використовувати 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
    }
});

19

Я шукав зробити те саме. Проблемою для мене було те, що моя URL-адреса була занадто довгою. Сьогодні я знайшов рішення, використовуючи бібліотеку 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 і менше). Однак є поліфайли для цих функцій, які зробили б його сумісним із більшою кількістю браузерів.


З 0.1.4 він також сумісний з IE 6-8, якщо вони все ще потрібні.
Стофф

8

Використання encodeURIComponent():

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})),

5

Я запропоную дивну альтернативу. Іноді простіше використовувати різні кодування, особливо якщо ви маєте справу з різними системами, які не всі обробляють деталі кодування URL однаково. Це не самий основний підхід, але може бути корисним у певних ситуаціях.

Замість того, щоб кодувати URL-адресою даних, ви можете базувати їх на 64-основі. Перевага цього в закодованих даних є дуже загальним, складається лише з альфа-символів, а іноді і з заднім числом= . Приклад:

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 дуже нейтральний, оскільки не використовує спеціальних символів.


нарешті знайшов тут адресу (% 26) мого друга (&)
Pradeep Kumar Prabaharan

Проблема з рядками base64 полягає в тому, що вони можуть містити
знак слэш

Це правда , але ви можете вибрати символи для використання в base64: замінити /з $, _або будь-який інший символ , який не вимагає кодування URL - адреса кожного RFC 3986.
Кріс Джонсон

0

Відповідь Делана ідеальна. Просто додавши до нього - якщо хтось хоче назвати параметри або передати кілька рядків 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')));

Сподіваюся, це допомагає!


Немає потреби у urldecode () даних, що надходять у PHP $ _POST або будь-яких інших (GET, REQEST тощо). Залежно від того, що ви робите звідси, ви, можливо, відкриватимете себе питання безпеки (введення SQL тощо)
Tit Petric
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.