2010-03-29 31 views
20

我正在使用JQuery向服務器發出JSON請求,似乎它的參數序列化是硬編碼到PHP所期望的,而不是通用的。基本上我有一個對象,看起來像這樣:沒有括號混亂的JQuery參數序列化

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

它它序列化爲:

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

反正讓它只是做?

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

這在我看來,jQuery的不應該如此依賴於什麼服務器端框架的少數期望的命名約定。如果我想讓我的參數名爲bar[],我可以很容易地將它命名爲我自己,如果這是我的服務器端代碼所期望的。

回答

26

我假設你使用的是JQuery 1.4。你應該看看這個:http://benalman.com/news/2009/12/jquery-14-param-demystified/

作者討論了爲什麼他們讓JQuery的行爲如此,並且提出了一些優秀的觀點。例如,如果不使用「方括號語法」,則不能只傳遞一個數值的數組。

他還提供了一個解決方法:

$.ajaxSetup({ traditional: true }); 

這將告訴jQuery來使用序列的非支架方法。

+4

好吧,如果你的服務器端語言/框架不會從查詢字符串,它是你的問題支持單元素數組吧:) 讓我回到我原來的觀點如果您的服務器端框架需要括號,那麼您應該更改您的參數名稱以匹配,而不是使其成爲服務器不可知的前端庫的默認值。 – mpeters 2010-03-31 02:28:08

+0

如果你所倡導的方法在某種程度上是「正確」的,那麼我想你的論點會更引人注目。顯然沒有RFC或標準涵蓋了應該如何處理數組語法,而且看起來像更新的技術正在選擇更靈活的選項。你說JQuery不應該與「命名約定」綁定,但它明確支持這兩種方法,並且你可以很容易地認爲非括號語法就是綁定的語法。 – zombat 2010-03-31 03:36:47

+0

有jQuery API指出:jQuery使用相同的鍵序列化多個值,即{foo:[「bar1」,「bar2」]}變爲'&foo = bar1&foo = bar2'。請注意,在提供的示例中,沒有出現括號... – 2010-04-14 21:56:20

11

該對象可以使用$.param(obj,true)轉換爲參數化字符串。第二個布爾參數指示應該使用序列化對象的傳統方法。當遇到相同的參數名稱時,傳統方法不使用方括號。從$.param返回的序列化字符串可以通過任何ajax方法傳遞。

這種方法優於使用$.ajaxSetup()通過,指出jQuery Documentation指出:

注:此處指定的設置將影響到$阿賈克斯或 基於AJAX的衍生物,所有呼叫如$不用彷徨()。這可能會導致不需要的行爲,因爲其他呼叫者(例如插件)可能會將 視爲正常的默認設置。爲此,我們強烈建議使用 來反對使用此API。相反,請在 調用中明確設置選項,或者定義一個簡單的插件來執行此操作。

例子:

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(){});