Всегда вызывайте JSON.stringify для данных post для jQuery Ajax
Или любую другую функцию для предварительной обработки ваших данных:)
Из-за моей структуры на стороне сервера мне всегда нужно вызывать JSON.stringify перед отправкой моих данных - ненужным шаблоном, который вы можете забыть добавить.
Сейчас у меня есть:
$.ajax({
[...]
data: JSON.stringify({ someData: self.someData }),
[...]
});
Я бы предпочел:
$.ajax({
[...]
data: { someData: self.someData },
[...]
});
Я просмотрел ajaxSetup, но не могу найти решение для этого, пока что...
Обновление
По какой причине мне это нужно, см. следующий этот вопрос. Я мог бы исправить это на сервере, но сейчас я ищу способ исправить это на клиентах.
Ответы
Ответ 1
Нет, нет встроенного способа предварительной обработки ваших данных с объекта в JSON. Однако вы можете использовать ajaxSetup
и beforeSend
, чтобы сделать это для вас.
$.ajaxSetup({
beforeSend: function(jqXHR,options){
if ( options.contentType == "application/json" && typeof options.data != "string" ) {
options.data = JSON.stringify(options.data);
}
}
});
Теперь просто установите для параметра contentType
значение application/json
для запросов, которым необходимо отправить json на сервер, чтобы он попадал в оператор if.
Ответ 2
Здесь используется альтернативный подход, в котором используется jQuery.prefilter:
$.ajaxPrefilter("json", function(options, originalOptions) {
options.data = JSON.stringify(originalOptions.data || null);
options.contentType = "application/json" // content type of *request*
});
$.ajax({
data: {foo: [1,2,3]},
dataType: "json" // expected content type of *response* (must match prefilter, above!)
[...]
});
Поскольку предварительные фильтры соответствуют параметру dataType
, мы должны установить его вручную в нашем запросе $.ajax
. Если dataType
соответствует префильтру ( "json" ), то перед отправкой запроса он преобразует объект data
в строку и устанавливает заголовок contentType
для соответствия ( "application/json" ).
Имейте в виду, что это глобальное изменение, которое повлияет на ВСЕ будущие запросы $.ajax
с dataType: "json"
!
Ответ 3
Здесь функция jQuery.prefilter, которую я использую (это лучше, чем метод beforeSend), он будет соответствовать любому типу данных и будет сериализовать любые объект в сообщении или по запросу.
$.ajaxPrefilter(function (options, org) {
var rtype = options.type.toLowerCase();
if ((rtype === "post" || rtype === "put") && org.data !== null && typeof org.data === 'object') {
options.data = JSON.stringify(org.data);
}
});
надеюсь, что это поможет.
Ответ 4
Пользователь Jquery.getJSON(). Вы можете напрямую получать данные json.
$.getJSON('', function(data) {
//you can use data.
});
http://api.jquery.com/jQuery.getJSON/