Как отправить JSON вместо строки запроса с $.ajax?

Может ли кто-нибудь объяснить простым способом, как заставить jQuery отправлять фактический JSON вместо строки запроса?

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});

Это на самом деле преобразует ваш тщательно подготовленный JSON в строку запроса. Одна из неприятных вещей заключается в том, что любой array: [] в вашем объекте будет преобразован в array[]: []Возможно, из-за ограничений строки запроса.

4 ответа

Решение

Вам нужно использовать JSON.stringify to first serialize your object to JSON, and then specify the contentType so your server understands it's JSON. Это должно сделать трюк:

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

Обратите внимание, что JSON object is natively available in browsers that support JavaScript 1.7 / ECMAScript 5 or later. If you need legacy support you can use json2.

Нет, dataType Опция для анализа полученных данных.

Чтобы опубликовать JSON, вы должны будете сами его преобразовать в строку JSON.stringify и установить processData возможность false,

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

Обратите внимание, что не все браузеры поддерживают JSON объект, и хотя jQuery имеет .parseJSON, в него не включен строковый преобразователь; вам понадобится еще одна библиотека polyfill.

Хотя я знаю, что многие архитектуры, такие как ASP.NET MVC, имеют встроенную функциональность для обработки JSON.stringify как contentType, моя ситуация немного отличается, поэтому, возможно, это может кому-то помочь в будущем. Я знаю, это спасло бы меня часами!

Поскольку мои http-запросы обрабатываются CGI API от IBM (среда AS400) на другом поддомене, эти запросы имеют перекрестное происхождение, отсюда и jsonp. Я фактически посылаю свой ajax через объект (ы) javascript. Вот пример моего AJAX POST:

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });

Если вы отправляете это обратно на asp.net и вам нужны данные в request.form[], тогда вам нужно установить тип контента на "application/x-www-form-urlencoded; charset=utf-8"

Оригинальный пост здесь

Во-вторых, избавьтесь от Datatype, если вы не ожидаете возврата, POST будет ждать около 4 минут, прежде чем потерпит неудачу. Смотрите здесь

Другие вопросы по тегам