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

Red*_*dro 166 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
});
Run Code Online (Sandbox Code Playgroud)

实际上,这会将您精心准备的JSON转换为查询字符串.令人讨厌的事情之一是,array: []您的对象中的任何内容都将被转换为array[]: [],可能是因为查询sting的限制.

mek*_*all 247

您需要JSON.stringify首先将对象序列化为JSON,然后指定,contentType以便您的服务器理解它的JSON.这应该做的伎俩:

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

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

  • 这不起作用,你缺少`contentType:'application/json'`. (14认同)
  • @Redsandro那不应该是必要的.根据jQuery文档:`根据W3C XMLHTTPRequest标准,POST数据将始终使用UTF-8字符集传输到服务器 (5认同)

Ber*_*rgi 26

不,该dataType选项用于解析接收的数据.

要发布JSON,您需要自己通过字符串化并将选项JSON.stringify设置processDatafalse.

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

请注意,并非所有浏览器都支持该JSON对象,尽管jQuery具有.parseJSON,但它没有包含字符串; 你需要另一个polyfill库.

  • 因为`JSON.stringify`已经返回一个字符串,所以不需要将`processData`设置为`false`. (3认同)

yar*_*lty 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
       });
Run Code Online (Sandbox Code Playgroud)

  • 感谢您为此问题添加更多知识!已经给出了令人满意的答案,但我赞成你的. (2认同)