2011-07-24 25 views
103

Używając JavaScript, chcę wygenerować link do strony. Parametry strony są w tablicy JavaScript, którą serializuję w JSON.Jak uniknąć ciągu JSON, aby mieć go w adresie URL?

Więc chciałbym, aby wygenerować adres URL tak:

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

Jak muszę uciec mój JSON ciąg (array odcinkach), aby uwzględnić go jako parametr w adresie URL?

Jeśli istnieje rozwiązanie wykorzystujące JQuery, bardzo bym to zrobił.

Uwaga: Tak, parametry strony muszą znajdować się w tablicy, ponieważ jest ich wiele. Myślę, że użyję bit.ly, aby później skrócić linki.

+0

Zobacz także http://stackoverflow.com/questions/21802866/how-to-compress-url-parameters – w00t

Odpowiedz

174
encodeURIComponent(JSON.stringify(object_to_be_serialised)) 
+5

Wydaje się jednak, że koduje więcej znaków niż jest to konieczne (gdy wkleję link w Firefoksie, niektóre znaki zostaną przywrócone back (tj. '{[" ').) Czy istnieje sposób kodowania tylko wymaganych znaków, aby móc skrócić moje adresy URL? –

5

Korzystanie encodeURIComponent():

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

można użyć encodeURIComponent bezpiecznie URL części kodowanie ciąg kwerendy:

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

lub jeśli wysyłasz to jako żądanie AJAX :

var array = JSON.stringify([ 'foo', 'bar' ]); 
$.ajax({ 
    url: 'http://example.com/', 
    type: 'GET', 
    data: { data: array }, 
    success: function(result) { 
     // process the results 
    } 
}); 
0

Odpowiedź udzielona przez Delan jest idealna. Po prostu dodajemy do niego - jeśli ktoś chce nazwać parametry lub przekazać wiele ciągów JSON osobno - poniższy kod mógłby pomóc!

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'))); 

Nadzieja to pomaga!

+0

Nie ma potrzeby, aby dane urldecode() przychodziły w PHP $ _POST lub jakiekolwiek inne (GET, REQEST, itp.) W zależności od tego, co robisz od tego momentu, możesz otwierać się na problemy z bezpieczeństwem (iniekcje SQL itp.). –

13

Szukałem tego samego. dla mnie problem polegał na tym, że mój adres był zbyt długi. Znalazłem rozwiązanie dzisiaj przy użyciu Bruno Jouhier's jsUrl.js library.

Nie testowałem jeszcze bardzo dokładnie. Jednak tutaj jest przykład pokazujący długości znaków na wyjściu ciąg po zakodowaniu tego samego dużego obiektu przy użyciu 3 różnych metod:

  • 2651 znaków używając jQuery.param
  • 1691 znaków używając JSON.stringify + encodeURIComponent
  • 821 znaków za pomocą JSURL.stringify

wyraźnie JSURL ma najbardziej zoptymalizowany format dla urlEncoding obiektu js.

wątek pod numerem https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q przedstawia testy porównawcze do kodowania i analizowania.

Uwaga: Po przeprowadzeniu testów, wygląda jsurl.js biblioteka korzysta ECMAScript 5 funkcji, takich jak Object.keys, Array.map i Array.filter.Dlatego będzie działać tylko w nowoczesnych przeglądarkach (nie 8 tj. Poniżej). Jednak są to języki kluczowe dla tych funkcji, które sprawiają, że jest kompatybilny z większością przeglądarek.

+0

Od wersji 0.1.4 jest on również kompatybilny z IE 6-8, jeśli nadal tego potrzebujesz. – Stoffe

2

będę oferują oddball alternatywy. Czasami łatwiej jest użyć innego kodowania, zwłaszcza jeśli masz do czynienia z różnymi systemami, które nie obsługują szczegółów kodowania adresów URL w ten sam sposób. Nie jest to podejście najbardziej powszechne, ale może się przydać w pewnych sytuacjach.

Zamiast kodowania adresu URL danych można je kodować w oparciu o kod base64. Zaletą tego jest to, że zakodowane dane są bardzo ogólne, składające się tylko ze znaków alfa i czasami kończące się ciągami =. Przykład:

JSON macierzach z ciągi:

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

tych danych Zakodowany jako data param:

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

SAMe, base64 kodowane:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd" 

Podejście base64 może być nieco krótsze, ale co ważniejsze, jest prostsze. Często mam problemy z przenoszeniem danych zakodowanych URL między cURL, przeglądarkami internetowymi i innymi klientami, zwykle z powodu cytatów, znaków wbudowanych % i tak dalej. Base64 jest bardzo neutralny, ponieważ nie używa znaków specjalnych.

Powiązane problemy