Сериализация массивов с помощью запроса jQuery.ajax() GET: как удалить числовые индексы?

#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, так что, возможно, это не так уж и странно.