2010-03-29 25 views
20

Sunucuya bir JSON isteği yapmak için JQuery kullanıyorum ve PHP'nin doğada genel olmak yerine PHP'nin beklediği parametrelerin serileştirilmesi gibi görünüyor. Temelde ben şöyle bir nesne vardır:JQuery parantez karışıklığı olmadan parametre serileştirmesi

{ 
    foo: 1, 
    bar : [1, 3, 5] 
} 

Ve bunu serializes:

foo=1&bar[]=1&bar[]=3&bar[]=5 

sadece yetinmek yine de var mı?

foo=1&bar=1&bar=3&bar=5 

O jQuery böylece sunucu tarafında çerçeveler bir avuç bir adlandırma kuralı olarak beklediğiniz bağlı olmamalıdır geliyor bana. Eğer benim paramimin bar[] olarak adlandırılmasını istediysem, sunucu tarafındaki kodumun beklediği şeyi kendim seçebilirim.

cevap

26

JQuery 1.4 kullanıyorsunuz. Şuna bir göz atmalısın: http://benalman.com/news/2009/12/jquery-14-param-demystified/

Yazar, JQuery'nin neden bu şekilde davrandığını ve bazı mükemmel noktaları ortaya koyduğunu tartışır. Örneğin, "köşeli parantez sözdizimini" kullanmıyorsanız, dizilerde yalnızca tek bir değerle geçemezsiniz.

O da bir iş-etrafında sunmaktadır:

$.ajaxSetup({ traditional: true }); 

Bu serileştirme olmayan braket yöntemi kullanmak JQuery söyleyecektir.

+4

Sunucu tarafı çerçevenizin parantez içinde olması gerekiyorsa, param adlarınızı eşleşecek şekilde değiştirmelisiniz, sunucu agnostik ön uç kütüphanesinin varsayılanı değil. – mpeters

+0

Savunmanızın yönteminin bir şekilde "doğru" olması durumunda, argümanınızın daha zorlayıcı olacağını düşünüyorum. Görünüşte RFC veya standart bir dizi sözdiziminin nasıl ele alınacağını açıklayan bir standart yok ve daha yeni teknolojilerin daha esnek bir seçenekle gitmeyi seçtiğine benziyor.JQuery'nin bir "adlandırma kuralı" na bağlı olmaması gerektiğini, ancak her iki yöntemi de açıkça desteklediğini söylersiniz ve aynı zamanda, destekleyici olmayan sözdiziminin bağlama işlemini yapan kişi olduğunu kolayca iddia edebilirsiniz. – zombat

+0

, aşağıdakileri belirleyen jQuery API'sı vardır: jQuery, aynı anahtarla birden çok değeri seri hale getirir, yani {foo: ["bar1", "bar2"]}, '& foo = bar1 & foo = bar2' olur. verilen örnekte nasıl bir parantez görünmediğine dikkat edin ... –

11

Nesne $.param(obj,true) kullanılarak parametrized bir dizeye dönüştürülebilir. İkinci boolean parametresi, bir nesnenin serileştirilmesinin geleneksel yöntemini belirtir. Geleneksel yöntem, aynı parametre adıyla karşılaştığında köşeli ayraç kullanmaz. $.param'dan döndürülen serileştirilmiş dize herhangi bir ajax yöntemi ile geçirilebilir.

Not:

Bu yöntem bildiren jQuery Documentation tarafından belirtildiği gibi $.ajaxSetup() kullanılmasına göre tercih edilmektedir, burada belirlenen ayar $ .ajax veya AJAX tabanlı türevlerine tüm çağrıları etkiler gibi $ .get olarak(). Bu, diğer arayanlar (örneğin, eklentiler) normal varsayılan ayarları beklediği için istenmeyen davranışına neden olabilir. Bu nedenle, bu API'yi kullanmaya karşı kesinlikle 'u öneririz. Bunun yerine, seçenekleri çağrısında açıkça ayarlayın veya bunu yapmak için basit bir eklenti tanımlayın.

Örnek:

var obj = {myProp: "test", arr: [1,2,3,4]}; 
var serializedObj = $.param(obj, true); //myprop=test&arr=1&arr=2&arr=3&arr=4 

$.post(url,serializedObj,function(){}); 
sunucu tarafı dil/framework senin sorunun bir sorgu dizesinden tek unsur diziler desteklemiyorsa Eh, doğru :) benim orijinal noktaya beni geri getirir
İlgili konular