2010-03-29 9 views
20

Sto usando JQuery per fare una richiesta JSON al server e sembra che la serializzazione dei parametri sia codificata su ciò che PHP si aspetta invece di essere di natura generica. Fondamentalmente ho un oggetto che assomiglia a questo:Serializzazione dei parametri JQuery senza la mensola della staffetta

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

Ed serializza a:

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

Esiste un modo per farlo basta fare?

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

Mi sembra che jQuery non dovrebbe essere così legata a quello che una manciata di quadri lato server si aspettano da una convenzione di denominazione. Se volessi che il mio parametro venisse chiamato bar[], potrei chiamarlo facilmente se è quello che si aspetta il mio codice lato server.

risposta

26

Suppongo che tu stia utilizzando JQuery 1.4. Dovresti dare un'occhiata a questo: http://benalman.com/news/2009/12/jquery-14-param-demystified/

L'autore spiega perché hanno fatto in modo che JQuery si comportasse in questo modo e ha dei punti eccellenti. Ad esempio, se non si utilizza la "sintassi della parentesi quadra", non è possibile passare gli array con un solo valore.

Egli offre anche un work-around:

$.ajaxSetup({ traditional: true }); 

questo vi dirà JQuery di utilizzare il metodo non-staffa di serializzazione.

+4

Beh, se la vostra lingua lato server/quadro non supporta gli array di elementi singoli da una stringa di query che è il tuo problema giusto :) mi riporta al punto di partenza che se il tuo framework lato server ha bisogno di parentesi, allora dovresti cambiare i tuoi nomi param in modo che corrispondano, non renderlo predefinito di una libreria front-end agnostica del server. – mpeters

+0

Immagino che il tuo argomento sarebbe più convincente se il metodo che stai sostenendo fosse in qualche modo "corretto". Apparentemente non esiste una RFC o uno standard che copra come dovrebbe essere gestita la sintassi dell'array, e sembra che le nuove tecnologie scelgano di optare per l'opzione più flessibile.Tu dici che JQuery non dovrebbe essere legato a una "convenzione di denominazione", ma supporta chiaramente entrambi i metodi, e si potrebbe facilmente argomentare che la sintassi senza parentesi quadra è quella che sta legando. – zombat

+0

c'è l'API jQuery che afferma: jQuery serializza più valori con la stessa chiave cioè {foo: ["bar1", "bar2"]} diventa '& foo = bar1 & foo = bar2'. nota come nell'esempio fornito non appare alcuna parentesi ... –

11

L'oggetto può essere convertito in una stringa parametrizzata utilizzando $.param(obj,true). Il secondo parametro booleano indica che dovrebbe essere usato il metodo tradizionale di serializzazione di un oggetto. Il metodo tradizionale non usa parentesi quadre quando incontra lo stesso nome di parametro. La stringa serializzata restituita da $.param può essere inoltrata tramite qualsiasi metodo ajax.

Questo metodo è preferito rispetto all'uso di $.ajaxSetup() come ha rilevato la jQuery Documentation che afferma:

Nota: Le impostazioni specificate qui si applicano tutte le chiamate a $ .ajax o derivati ​​basate su AJAX come $ .get(). Ciò può causare un comportamento indesiderato poiché altri chiamanti (ad esempio, plug-in) potrebbero aspettarsi le normali impostazioni predefinite. Per questo motivo consigliamo vivamente di di non utilizzare questa API. Invece, imposta le opzioni esplicitamente nella chiamata o definisci un semplice plugin per farlo.

Esempio:

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