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


172

有人可以用一种简单的方式解释如何使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[]: [],这可能是由于查询字符串的限制所致。


7
dataType对数据的发送方式没有关系。它仅指定您希望通过调用返回的数据类型。如果要向服务器指示要在data属性中指定的数据类型,则需要将contentType属性设置为类似于contentType: "application/json"
Nope 2012年

感谢您的澄清。但是在那种情况下,如果服务器在响应中提供了内容类型标头,为什么还要在客户端指定响应类型?
Redsandro

2
你不必指定它,默认情况下,jQuery将尝试使基于MIME类型的响应的智能猜测。但是,通过指定它,您将明确告诉jQuery您希望服务器提供哪种类型,并且jQuery会尝试将响应转换为该类型的对象。不指定它并让jQuery猜测可能会导致jQuery将响应转换为意外格式,即使您从服务器发送了JSON也是如此。请查看文档以获取有关dataType的更多详细信息:api.jquery.com/jQuery.ajax
Nope

Answers:


256

您需要使用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


14
这不起作用,您不见了contentType: 'application/json'
Ohgodwhy 2012年

@Ohgodwhy哦,是的。太快了;)
mekwall 2012年

1
谢谢。我以为dataType可以解决这个问题,但是我倒向了。对于在其他答案中像Bergi这样的内容类型中指定字符集有任何想法吗?
Redsandro 2012年

5
@Redsandro没必要。根据jQuery文档:POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard
mekwall 2012年

1
@ shorif2000比总比没有来晚。。。问题是,在$_POSTphp中,您只能看到application/x-www-form-urlencoded,如果您想读取json数据,则必须这样做file_get_contents("php://input"),然后可能是json_decode()
santiago arizti

28

不,该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库。


4
不必设置processData为,false因为JSON.stringify已经返回了一个字符串。
mekwall 2012年

@MarcusEkwall:Afaik仍然会被encodeURIComponent教育,不是吗?
Bergi 2012年

好的,可能不需要,但是您真的认为这会使请求失败吗?
Bergi 2012年

考虑到它已经是一个字符串,它不应使它失败。
凯文B

1
@Redsandro:是的,它正在进行“智能猜测”。但是,使用该参数的原因(不仅是)人们要严格设置参数,还因为他们没有在服务器响应中设置适当的MIME类型。
Bergi 2012年

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
       });

2
感谢您为这个问题添加更多知识!令人满意的答案已经给出,但我支持您。
Redsandro

1

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

原始帖子在这里

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.