Подтвердить что ты не робот

Сериализация параметров JQuery без беспорядка

Я использую JQuery, чтобы сделать запрос JSON обратно на сервер, и кажется, что сериализация параметров жестко запрограммирована на то, что PHP ожидает, а не является общим по своей природе. В основном у меня есть объект, который выглядит так:

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

И он сериализует его:

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

Есть ли способ сделать это просто?

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

Мне кажется, что jQuery не должен быть привязан к тому, что горстка серверных фреймворков ожидает как соглашение об именах. Если бы я хотел, чтобы мой параметр был вызван bar[], я мог бы легко назвать его сам, если это будет ожидать мой серверный код.

4b9b3361

Ответ 1

Я предполагаю, что вы используете JQuery 1.4. Вы должны взглянуть на это: http://benalman.com/news/2009/12/jquery-14-param-demystified/

Автор обсуждает, почему они заставили JQuery вести себя таким образом и делает несколько отличных точек. Например, если вы не используете синтаксис "квадратной скобки", вы не можете передавать массивы только с одним значением.

Он также предлагает работу:

$.ajaxSetup({ traditional: true });

Это позволит JQuery использовать метод сериализации без привязки.

Ответ 2

Объект может быть преобразован в параметризованную строку с помощью $.param(obj,true). Второй логический параметр указывает, что должен использоваться традиционный метод сериализации объекта. Традиционный метод не использует квадратные скобки, когда он сталкивается с тем же именем параметра. Сериализованная строка, возвращаемая из $.param, может быть передана любым методом ajax.

Этот метод предпочтительнее использования $.ajaxSetup(), как указано в jQuery Documentation, в котором говорится:

Примечание. Указанные здесь настройки будут влиять на все вызовы $.ajax или Производные на основе AJAX, такие как $.get(). Это может вызвать нежелательные поведение, поскольку другие абоненты (например, плагины) могут ожидать обычные настройки по умолчанию. По этой причине мы настоятельно рекомендуем против использования этого 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(){});