【问题标题】:Why does my $.ajax() JSON data get posted back to the server like this?为什么我的 $.ajax() JSON 数据会这样回传到服务器?
【发布时间】:2010-11-15 08:21:30
【问题描述】:

我有一个 javascript 中的项目列表:

var list = {
    { id: 1, name: 'Charles' }, 
    { id: 8, name: 'John' }, 
    { id: 13, name: 'Sally' }
};

但是当我像这样将它发布到服务器时:

$.ajax({
    url: '/Controller/ActionName',
    data: { items: list }
});

它像这样到达服务器:

items[0][id]=1&items[0][name]=Charles&items[1][id]=8&items[1][name]=John&items[2][id]=13&items[2][name]=Sally

我如何让它以 JSON 表示法到达,即用大括号!以便.NET 解析器可以正确解析它?

【问题讨论】:

  • 你需要把它转换成一个字符串(格式化的JSON)然后发布它
  • 我如何做到这一点?我认为下面的djch 试图在下面显示这一点,但使用我假设来自外部库的stringify。必须在 jQuery 或 javascript 中内置一些东西才能做到这一点?
  • 使用 $.post。 $.ajax 使用 GET,这意味着没有请求正文。 JSON 不能放在查询字符串中,它必须放在正文中。
  • JSON.stringify 原生地融入了大多数现代浏览器(甚至是在 IE8 模式下运行的 IE8!)并且是 JSON.parse 的对应物。如果浏览器本身不支持它,你可以从 json.org 中包含 json2.js 来添加对它的支持。

标签: javascript asp.net jquery ajax json


【解决方案1】:

试试:

$.ajax({
    url: '/Controller/ActionName',
    data: { items: JSON.stringify(list) }
});

我尝试了以下选项:

 <script type="text/javascript">

    var list = [
    { id: 1, name: 'Charles' }, 
    { id: 8, name: 'John' }, 
    { id: 13, name: 'Sally' }
];


  function run(){
      $.ajax({
          url: 'default.aspx',
          data: { items: JSON.stringify(list) }
      });

      return false;

  }

  function run2() {
      $.ajax({
          url: 'default.aspx',
          data: { items: list }
      });
      return false;

  }

  function run3() {
      $.ajax({
          url: 'default.aspx',
          data: { items: list },
          processData: false
      });
      return false;
  }

  function run4() {
      $.ajax({
          url: 'default.aspx',
          data: list
      });
      return false;
  }
</script>

运行 1:default.aspx?items=%5B%7B%22id%22%3A1%2C%22name%22%3A%22Charles%22%7D%2C%7B%22id%22%3A8% 2C%22name%22%3A%22John%22%7D%2C%7B%22id%22%3A13%2C%22name%22%3A%22Sally%22%7D%5D

Querystring["items"] = '[{"id":1,"name":"Charles"},{"id":8,"name":"John"},{"id":13 ,"姓名":"莎莉"}]'

运行 2:default.aspx?items%5B0%5D%5Bid%5D=1&items%5B0%5D%5Bname%5D=Charles&items%5B1%5D%5Bid%5D=8&items%5B1%5D%5Bname %5D=John&items%5B2%5D%5Bid%5D=13&items%5B2%5D%5Bname%5D=Sally

项目[0][id] 1

items[0][name] 查尔斯

项目[1][id] 8

items[1][name] 约翰

项目[2][id] 13

物品[2][名称] 莎莉

运行 3:default.aspx?[object%20Object]

[对象对象]

运行 4:default.aspx?Charles=undefined&John=undefined&Sally=undefined

请求[“查尔斯”] = '未定义'

请求[“约翰”] = '未定义'

请求["Sally"] = '未定义'

现在来自 OP,我认为 Run 1 是必需的选项,因为他想在服务器端处理 JSON 字符串?

【讨论】:

  • 谢谢,非常彻底的测试!这些也是我现在设法在服务器端获得的。您是否能够使用 Run 1 在服务器端重建数据?顺便说一句,如果你成功了,你可以为这篇文章和stackoverflow.com/questions/4164114/… 加分! :)
【解决方案2】:

我在我的手机上,但您可以通过使用以下库将您的 JSON 对象转换为格式良好的 JSON 字符串来解决此问题。

jquery JSON project

该库只有 3k 大小,还为您提供额外的 JSON 功能,例如解析等。

在页面中包含脚本后,您可以将对象转换为 JSON 字符串并使用以下方法进行调用:

$.ajax({
        type: "POST",
        url: '/Controller/ActionName',
        cache: false,
        data: $.toJSON(list), // Convert JSON object to String for Post
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            GenerateResultsCallback(response.d)
        },
        error: function (e) {
            alert('error during ajax request');
        }
    });

【讨论】:

    【解决方案3】:

    来自 JQuery AJAX Page:

    数据选项可以包含 表单的查询字符串 key1=value1&key2=value2,或映射 形式 {key1: 'value1', key2: '值2'}。如果使用后一种形式, 数据被转换为查询 发送之前的字符串。这 处理可以通过 将 processData 设置为 false

    因此您的 JSON 对象被转换为查询字符串。

    【讨论】:

    • 我尝试设置processData: false,所取得的成果就是以某种方式神奇地发布NO数据。我希望我可以调试 jQuery 但是...
    【解决方案4】:

    使用 $.post() 而不是 $.ajax() 它应该适合你。

    $.ajax 执行 GET 请求,这就是为什么它将您的 JSON 转换为字符串并附加到查询字符串的原因。

    编辑: 看起来您正在尝试发布对象列表,在这种情况下,您的 var 应该是这样的对象数组:

    var list = [
        { id: 1, name: 'Charles' }, 
        { id: 8, name: 'John' }, 
        { id: 13, name: 'Sally' }
    ];
    
    
    $.post({
        url: '/Controller/ActionName',
        data: { "items": list }
    });
    

    【讨论】:

    • 我的 $.ajax() 有一个全局设置来强制一个 POST,不幸的是仍然没有解决问题。 $.post() 也没有。这里的问题是jQuery如何序列化post数据...
    • 尝试使用 data: list 作为 $.post 的参数
    猜你喜欢
    • 2016-11-27
    • 2013-01-07
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多