2010-03-29 9 views
20

Estoy usando JQuery para hacer una solicitud JSON de vuelta al servidor y parece que su serialización de parámetros está codificada a lo que PHP espera en lugar de ser de naturaleza genérica. Básicamente tengo un objeto que se parece a esto:serialización de parámetros de JQuery sin el corchete mess

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

Y serializa a:

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

¿Hay alguna forma de hacer que acaba de hacer?

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

Me parece que jQuery no debe ser tan ligada a lo que un puñado de marcos laterales de servidor esperar ya que una convención de nomenclatura. Si quisiera que mi param se llamara bar[] podría nombrarlo fácilmente yo mismo si es lo que mi código de servidor espera.

Respuesta

26

Supongo que está utilizando JQuery 1.4. Debería echar un vistazo a esto: http://benalman.com/news/2009/12/jquery-14-param-demystified/

El autor explica por qué hicieron que JQuery se comporte de esta manera, y hace algunos puntos excelentes. Por ejemplo, si no usa la "sintaxis del corchete cuadrado", no puede pasar matrices con un solo valor.

También ofrece una solución alternativa:

$.ajaxSetup({ traditional: true }); 

Esto le dirá jQuery para usar el método no soporte de serialización.

+4

Bueno, si su lenguaje del lado del servidor/marco no es compatible con matrices solo elemento de una cadena de consulta que es el problema de la derecha :) me hace volver a mi punto original que si su marco de trabajo del lado del servidor necesita corchetes, entonces debe cambiar sus nombres de param para que coincidan, no convertirlo en el predeterminado de una biblioteca front-end independiente del servidor. – mpeters

+0

Supongo que su argumento sería más convincente si el método que defiende es, de algún modo, el "correcto". Aparentemente, no existe un RFC o estándar que cubra cómo se debe manejar la sintaxis de la matriz, y parece que las tecnologías más nuevas eligen ir con la opción más flexible.Usted dice que JQuery no debe estar ligado a una "convención de nomenclatura", pero claramente apoya ambos métodos, y podría fácilmente argumentar que la sintaxis sin paréntesis es la que realiza la vinculación. – zombat

+0

existe la API jQuery que establece: jQuery serializa múltiples valores con la misma clave, es decir, {foo: ["bar1", "bar2"]} se convierte en '& foo = bar1 & foo = bar2'. observe cómo en el ejemplo proporcionado no aparecen corchetes ... –

11

El objeto se puede convertir a una cadena parametrizada usando $.param(obj,true). El segundo parámetro booleano indica que se debe usar el método tradicional de serialización de un objeto. El método tradicional no usa corchetes cuando encuentra el mismo nombre de parámetro. La cadena serializada devuelta desde $.param se puede pasar a través de cualquier método ajax.

Este método es preferido sobre el uso de $.ajaxSetup() como señaló el jQuery Documentation que dice:

Nota: Los valores especificados aquí afectará a todas las llamadas a $ .ajax o derivados basados ​​en AJAX como $ .get(). Esto puede provocar un comportamiento no deseado de , ya que otras personas que llaman (por ejemplo, complementos) pueden esperar la configuración predeterminada normal. Por esa razón, recomendamos encarecidamente contra el uso de esta API. En su lugar, configure las opciones explícitamente en la llamada o defina un complemento simple para hacerlo.

Ejemplo:

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