#jquery #ajax #arrays #api
#jquery #ajax #массивы #API
Вопрос:
Почему jQuery добавляет числовые индексы к массивам в запросах GET с помощью .ajax()? Есть ли способ удалить их?
Например, в jQuery, допустим, я отправляю следующее в качестве данных в .ajax():
var source = {
"type": "database",
"criteria": {
"match": "all",
"rules": [{"equals": 1, "val": "test"}, {"equals": 1, "val": "two"}]
}
Я хочу, чтобы переменная правил была сериализована в виде массива. Это сериализуется как следующий URL, который использует .ajax():
api?source[type]=databaseamp;[criteria][rules][0][equals]=1amp;source[criteria][rules][0][val]=testamp;source[criteria][rules][1][equals]=1amp;source[criteria][rules][1][val]=two
Поскольку массивы проиндексированы (правила [0] и правила[1]), это интерпретируется на сервере как:
"rules"=>{"0"=>{"equals"=>"1", "val"=>"test"}, "1"=>{"equals"=>"1", "val"=>"test"}}
Подтверждаю, теперь это объект! Что мне нужно, так это сериализовать его как таковой:
api?source[type]=databaseamp;[criteria][rules][][equals]=1amp;source[criteria][rules][][val]=testamp;source[criteria][rules][][equals]=1amp;source[criteria][rules][][val]=two
использование правил [] (без индекса). Затем это правильно интерпретируется как:
"rules"=>[{"equals"=>"1", "val"=>"test"}, {"equals"=>"1", "val"=>"test"}]
Массив!
Есть ли настройка для управления этим с помощью ajax? Я безуспешно поиграл с различными настройками, такими как DataType и traditional.
Я предполагаю, что использование var[] (без индекса) является правильным, поскольку я видел это в примерах в документации jQuery:
$.get("test.php", { 'choices[]': ["Jon", "Susan"]} );
Ответ №1:
Я не верю, что вы можете изменить способ, которым jQuery это делает. На вашем месте я бы написал быструю функцию для генерации нужного параметра из вашего массива в виде строки, а затем привязал этот параметр к запросу ajax, используя свойство data, как показано ниже:
$.ajax({
type: "GET",
url: "some.php",
data: "name=Johnamp;location=Boston",
success: function(msg){
alert( "Data Saved: " msg );
}
});
Комментарии:
1. Да, мы закончили тем, что JSON.stringify() ввел его и обработал на сервере. Просто не так элегантно.
2. Я согласен. Интересно, что большинство внутренних языков, которые я использовал, повторно собирают странный механизм post jQuery, так что, возможно, это не так уж и странно.