проблема с скобками в форме jQuery данных при отправке данных как json

17

У меня есть объект

    var dataformdata={"key1":"value1","key2":"value2"};

, то я добавляю несколько значений с тем же ключом (key3), что и этот

    dataformdata.key3 = [];
    dataformdata.key3.push("value3");
    dataformdata.key3.push("value4");

Я делаю это на каждом склоне. Все это работает, за исключением отправки объекта dataformdata с помощью функции jQuery ajax в консоли браузера. Я вижу, что в ключе находятся скобки ...

$.ajax({ type: "POST", url: "/", data: dataformdata, ...

Это то, что я вижу в консоли браузера:

key1:value1
key2:value2
key3%5B%5D:value3
key3%5B%5D:value4

Он должен работать, потому что в документах jQuery.ajax () он говорит

  

Объектом должны быть пары «ключ / значение». Если значением является массив, jQuery сериализует несколько значений одним и тем же ключом на основе значения традиционной настройки

Но почему в ключе скобки (% 5B% 5D)?

    
задан Hans 15.05.2011 в 23:13
источник
  • Это неявное и удивительное поведение jquery вызвало много проблем при использовании struts. Подробнее см. Здесь: issues.apache.org/jira/browse/BEANUTILS-334 –  AlikElzin-kilaka 17.12.2015 в 16:13

4 ответа

12

Это обозначение с помощью скобок в ключе было введено в jQuery 1.4 для обработки многомерных массивов или массивов, содержащих объекты (или другие массивы). Это помогает десериализатору различать массив и примитивное значение. Например, если у вас не было скобок в ключе, эти две переменные были бы сериализованы одинаково:

var v1 = { "k1":"v1", "k2":"v2", "k3":["v3"] };

и

var v1 = { "k1":"v1", "k2":"v2", "k3":"v3" };

С обозначением скобки они закодированы как

k1=v2&k2=v2&k3[]=v3

и

k1=v2&k2=v2&k3=v3

соответственно.     

ответ дан carlosfigueira 15.05.2011 в 23:19
  • Спасибо за объяснение. И я узнал, что могу удалить скобки, используя jQuery.param (dataformdata, true), чтобы выполнить традиционную «мелкую» сериализацию. –  Hans 17.05.2011 в 15:27
13

вы также можете использовать настройки traditional в вызове ajax Ссылка

  

традиционный Тип: Логическое

     

Установите для этого значение значение true, если вы хотите использовать   традиционный стиль параметрической сериализации.

, например:

$.ajax({
 /*usual stuff */
 traditional: true
})
    
ответ дан maazza 08.01.2014 в 16:58
  • Не может быть ответом на вопрос, но на основе ответа выше, это то, что сработало для меня для отправки смеси нескольких значений с одним и тем же ключом и уникальными ключами и значениями. $ .ajax (url, {data: {id: [value1, value2], whatever: true}, традиционный: true, dataType: "json"}); –  Sebastian Thomas 29.07.2014 в 18:51
3

В сценарий можно отправить несколько фрагментов данных с одним и тем же именем. Вы можете сделать это, добавив квадратные скобки [] в конец имени ключа, чтобы указать, что данные должны интерпретироваться как массив.

Функция, которая делает это, jQuery.param . В качестве примера того, как это работает:

$.param({
    data: ['value3', 'value4']
});

data - массив. Когда он сериализуется, он отображается как data%5B%5D=value3&data%5B%5D=value4 . Скрипт serveride преобразует его в массив.

    
ответ дан lonesomeday 15.05.2011 в 23:22
2

В основном это соглашение об именах - я думаю, из PHP - это означает, что ключ ( key3 ) является многозначным. Это зависит от того, что сервер расшифровывает эти значения.

Подробнее: Ссылка

    
ответ дан Matt Ball 15.05.2011 в 23:19