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

IT技术 javascript jquery json query-string
2021-01-14 11:10:24

有人可以简单地解释一下如何让 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将您的对象序列化为 JSON,然后指定contentType以便您的服务器理解它是 JSON。这应该可以解决问题:

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

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

谢谢。我认为 dataType 解决了这个问题,但我倒退了。关于在内容类型中指定字符集的任何想法,就像 Bergi 在另一个答案中所做的那样?
2021-03-15 11:10:24
@Redsandro 那应该没有必要。根据 jQuery 文档:POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard
2021-03-15 11:10:24
@shorif2000 迟到总比没有好......问题是$_POST在 php 中你只能看到application/x-www-form-urlencoded,如果你想读取 json 数据,你必须这样做file_get_contents("php://input"),也许然后json_decode()
2021-03-21 11:10:24
@Ohgodwhy 哦,是的。这有点太快了;)
2021-03-28 11:10:24
这行不通,你错过了contentType: 'application/json'
2021-04-05 11:10:24

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

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

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

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

考虑到它已经是一个字符串,它不应该让它失败。
2021-03-11 11:10:25
由于已经返回一个字符串,因此不需要设置processDatafalseJSON.stringify
2021-03-14 11:10:25
好吧,它可能不需要,但你真的认为它会使请求失败吗?
2021-03-15 11:10:25
@Redsandro:是的,它正在做一个“智能猜测”。但是,该参数的原因不仅是(仅)人们想要使其严格,而且更多的是他们没有在服务器响应中设置适当的 MIME 类型。
2021-03-26 11:10:25
@MarcusEkwall:Afaik 它仍然会被encodeURIComponent编辑,不是吗?
2021-03-30 11:10:25

虽然我知道像 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
       });
感谢您为这个问题添加更多知识!已经给出了令人满意的答案,但我赞成你的答案。
2021-03-26 11:10:25

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

原帖在这里

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