使用jQuery发送JSON数据

时间:2011-07-05 18:32:42

标签: javascript jquery ajax

为什么以下代码以City=Moscow&Age=25而不是JSON格式发送数据?

var arr = {City:'Moscow', Age:25};
$.ajax(
   {
        url: "Ajax.ashx",
        type: "POST",
        data: arr,
        dataType: 'json',
        async: false,
        success: function(msg) {
            alert(msg);
        }
    }
);

5 个答案:

答案 0 :(得分:165)

因为您既未指定请求内容类型,也未指定JSON请求。以下是发送JSON请求的正确方法:

var arr = { City: 'Moscow', Age: 25 };
$.ajax({
    url: 'Ajax.ashx',
    type: 'POST',
    data: JSON.stringify(arr),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    async: false,
    success: function(msg) {
        alert(msg);
    }
});

需要注意的事项:

  • 使用JSON.stringify方法将javascript对象转换为JSON字符串,该字符串是本机和内置现代浏览器。如果您想支持旧版浏览器,则可能需要添加json2.js
  • 使用contentType属性指定请求内容类型,以便向服务器指示发送JSON请求的意图
  • dataType: 'json'属性用于您希望从服务器获得的响应类型。 jQuery非常智能,可以从服务器Content-Type响应头中猜测它。因此,如果您的Web服务器或多或少地尊重HTTP协议并以Content-Type: application/json响应您的请求,jQuery将自动将响应解析为javascript对象到success回调中,这样您就不会需要指定dataType属性。

要小心的事情:

  • 您所谓的arr 不是数组。它是一个具有属性(CityAge)的javascript对象。数组在javascript中用[]表示。例如,[{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]是一个包含2个对象的数组。

答案 1 :(得分:9)

因为默认情况下,jQuery将作为data参数传递的对象序列化为$.ajax。它使用$.param将数据转换为查询字符串。

来自$.ajax的jQuery文档:

  

[data参数]转换为查询字符串,如果不是字符串

如果你想发送JSON,你必须自己编码:

data: JSON.stringify(arr);

请注意,JSON.stringify仅出现在现代浏览器中。有关旧版支持,请查看json2.js

答案 2 :(得分:4)

我写了一个简短的便利函数来发布JSON。

$.postJSON = function(url, data, success, args) {
  args = $.extend({
    url: url,
    type: 'POST',
    data: JSON.stringify(data),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    async: true,
    success: success
  }, args);
  return $.ajax(args);
};

$.postJSON('test/url', data, function(result) {
  console.log('result', result);
});

答案 3 :(得分:1)

您需要设置正确的内容类型并对对象进行字符串化。

var arr = {City:'Moscow', Age:25};
$.ajax({
    url: "Ajax.ashx",
    type: "POST",
    data: JSON.stringify(arr),
    dataType: 'json',
    async: false,
    contentType: 'application/json; charset=utf-8',
    success: function(msg) {
        alert(msg);
    }
});

答案 4 :(得分:0)

它被序列化,以便URI可以默认读取POST请求中的名称值对。您可以尝试将processData:false设置为params列表。不确定这是否会有所帮助。