URL'ye sahip olmak için bir JSON dizesinin dışına nasıl çıkılır?


129

Javascript kullanarak bir sayfaya bir bağlantı oluşturmak istiyorum. Sayfanın parametreleri JSON'da serileştirdiğim bir Javascript dizisinde.

Bu yüzden şöyle bir URL oluşturmak istiyorum:

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

JSON dizemden (dizi serileştirilmiş) bir URL'ye parametre olarak eklemek için nasıl çıkış yapmam gerekir?

JQuery kullanan bir çözüm varsa çok sevinirim.

Not: Evet, sayfadaki parametrelerin bir dizi içinde olması gerekir çünkü çok sayıda vardır. Sanırım daha sonra bağlantıları kısaltmak için bit.ly kullanacağım.


Yanıtlar:


210
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
Gerektiğinden daha fazla karakter kodluyor gibi görünüyor (bağlantıyı Firefox'a yapıştırdığımda bazı karakterler geri döndürülüyor (yani {["). URL'lerimi kısaltabilmem için yalnızca gerekli karakterleri kodlamanın bir yolu var mı?
Matthieu Napoli

19

encodeURIComponentBir sorgu dizesinin parçalarını güvenli bir şekilde URL kodlamak için kullanabilirsiniz :

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

veya bunu bir AJAX isteği olarak gönderiyorsanız:

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

19

Ben de aynı şeyi yapmaya çalışıyordum. benim için sorun url’min çok uzun sürmesiydi. Bugün Bruno Jouhier'in jsUrl.js kitaplığını kullanarak bir çözüm buldum .

Henüz tam olarak test etmedim. Ancak, aynı büyük nesneyi 3 farklı yöntem kullanarak kodladıktan sonra dize çıktısının karakter uzunluklarını gösteren bir örnek aşağıda verilmiştir:

  • 2651 karakter kullanıyor jQuery.param
  • 1691 karakter kullanıyor JSON.stringify + encodeURIComponent
  • 821 karakter kullanıyor JSURL.stringify

açıkça JSURL, bir js nesnesini urlEncoding için en iyileştirilmiş biçime sahiptir.

https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q adresindeki ileti dizisi, kodlama ve ayrıştırma için karşılaştırmaları gösterir.

Not : Test ettikten sonra, jsurl.js kitaplığının Object.keys, Array.map ve Array.filter gibi ECMAScript 5 işlevlerini kullandığı görülüyor. Bu nedenle, yalnızca modern tarayıcılarda çalışacaktır (ie 8 ve altı). Ancak, bu işlevler için onu daha fazla tarayıcıyla uyumlu hale getirecek çoklu dolgular vardır.


0.1.4'ten bu yana, hala ihtiyacınız varsa IE 6-8 ile de uyumludur.
Stoffe

8

Kullanarak encodeURIComponent():

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

5

Tuhaf bir alternatif sunacağım. Bazen farklı kodlama kullanmak daha kolaydır, özellikle de URL kodlamasının ayrıntılarını aynı şekilde işlemeyen çeşitli sistemlerle uğraşıyorsanız. Bu en yaygın yaklaşım değildir, ancak belirli durumlarda kullanışlı olabilir.

Verileri URL olarak kodlamak yerine, onu base64 olarak kodlayabilirsiniz. Bunun yararı, kodlanmış verilerin çok genel olması, yalnızca alfa karakterlerden ve bazen de sondaki karakterlerden oluşmasıdır =. Misal:

JSON dizi dizisi:

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

dataParametre olarak URL kodlu bu veriler :

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

Aynı, base64 olarak kodlanmış:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

Base64 yaklaşımı biraz daha kısa olabilir, ancak daha da önemlisi daha basittir. URL kodlu verileri cURL, web tarayıcıları ve diğer istemciler arasında taşırken, genellikle alıntılar, gömülü %işaretler vb. Nedenlerle sık sık sorunlar yaşıyorum . Base64 çok tarafsızdır çünkü özel karakterler kullanmaz.


sonunda arkadaşımın adresini (% 26) burada (&) buldu
Pradeep Kumar Prabaharan

base64 dizeleriyle ilgili sorun, eğik çizgi (/) karakteri içerebilmeleridir, bu da url'yi geçersiz kılar ...
ingbabic

Bu doğru ama sen base64 kullanmayı karakterleri seçebilirsiniz: değiştirmek /ile $, _ya yapar başka bir karakter RFC 3986. başına url kodlama gerektirmez
Chris Johnson

0

Delan'ın verdiği cevap mükemmel. Sadece ekleyerek - birisinin parametreleri adlandırmak veya birden çok JSON dizesini ayrı ayrı geçirmek istemesi durumunda aşağıdaki kod yardımcı olabilir!

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

Bu yardımcı olur umarım!


PHP $ _POST veya başka herhangi bir (GET, REQEST, vb.) Gelen verilerin urldecode () kodlamasına gerek yoktur. Bundan sonra ne yaptığınıza bağlı olarak, kendinizi bir güvenlik sorunu için açıyor olabilirsiniz (SQL enjeksiyonu, vb.)
Tit Petric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.