如何使用$ .ajax发送JSON而不是查询字符串?

时间:2012-10-02 16:00:46

标签: javascript jquery json query-string

有人能否以简单的方式解释如何让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[]: [],可能是因为查询sting的限制。

4 个答案:

答案 0 :(得分:241)

您需要使用JSON.stringify首先将对象序列化为JSON,然后指定contentType,以便您的服务器了解它的JSON。这应该可以解决问题:

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

请注意,JSON对象在支持JavaScript 1.7 / ECMAScript 5或更高版本的浏览器中原生可用。如果您需要旧版支持,可以使用json2

答案 1 :(得分:26)

不,dataType option用于解析收到的数据。

要发布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库。

答案 2 :(得分:5)

虽然我知道像ASP.NET MVC这样的许多架构都有内置的功能来处理JSON.stringify作为contentType我的情况有点不同所以这可能会对将来有所帮助。我知道这会节省我几个小时!

由于我的http请求是由来自IBM(AS400环境)的CGI API在不同的子域上处理的,因此这些请求是交叉源,因此是jsonp。我实际上是通过javascript对象发送我的ajax。这是我的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
       });

答案 3 :(得分:1)

如果你要将它发送回asp.net并需要request.form []中的数据,那么你需要将内容类型设置为“application / x-www-form-urlencoded; charset = utf-8 “

原帖[{3}}

其次摆脱数据类型,如果你不期望返回,POST将在失败前等待大约4分钟。见here