【问题标题】:sending a post request with json data that contains a list发送带有包含列表的 json 数据的 post 请求
【发布时间】:2014-06-16 07:12:35
【问题描述】:

解决了。解决方案是将 contentType 设置为 'application/json' 并使用 JSON.stringify(obj) 而不是 obj,但是您可能必须根据语言或框架更改在服务器上获取数据的方式。下面的原始问题...

这就是我正在尝试的方法

var obj = {
    'firstName': 'bill',
    'lastName': 'johnson',
    'hobbies': ['apples', 'dogs']
    });
$.ajax({
    type: 'POST',
    url: '/myurl'
    data: obj,
    success: function(data){alert(data);}
    });

如果我提醒/记录JSON.stringify(obj),我会得到正确的结果,即:

{'firstName': 'bill', 'lastName': 'johnson', 'hobbies': ['apples', 'dogs']}

但是,当我执行上述 ajax 调用时,我的服务器会得到以下信息:

{'firstName': 'bill', 'lastName': 'johnson', 'hobbies[]': 'apples'}

这显然不是正确的 json。我尝试添加各种 contentType 参数,但我的服务器实际上什么也没得到(一个空的发布请求)。

我还尝试将 data 参数设置为 JSON 的预字符串化字符串(这是正确的),但随后 jquery 对其进行了转义,我的服务器得到了这个:

{"{\"firstName\":\"bill\",\"lastName\":\"johnson\",\"hobbies\":[\"apples\",\"dogs\"]}": ""}

我尝试将processData 设置为false,但没有任何改变。

我已经研究了好几个小时,但还没有让它发挥作用。当然有一种方法可以将带有列表的 json 发送到服务器......

有什么建议吗?

【问题讨论】:

  • 将 obj 作为 JSON.stringify(obj) 发送。如果需要,在服务器端反序列化相同的内容或一些 html 解码内容。
  • 服务器想怎么获取?您可以将数据作为 JSON 发送,而不是 x-www-form-urlencoded ... benjamin-schweizer.de/jquerypostjson.html -- 这里还有一些背景资料:stackoverflow.com/questions/2845459/…
  • @mgilson 服务器希望将其作为原始的、未转义的 json 获取,例如 {"firstname": "bill"... 等,但如有必要可能会改变。我将尝试博客文章中的代码。
  • @user3391564 -- 我怀疑它收到了一个空请求。问题是大多数框架都需要 x-www-form-urlencoded 数据。如果您实际查看请求 body,JSON 将在其中(您可能需要自己解析)。我最近在处理来自 angular 的 $http 的请求时遇到了这个问题(因为它将 json 发布为 application/json 这实际上是有道理的......)

标签: javascript jquery ajax json post


【解决方案1】:

从您看起来对我来说正确的帖子来看,我自己对 JSON 有点陌生,但它看起来像是将最后一个键值对视为一个数组,要访问您必须使用正确的索引来访问的各个元素价值。来自 json.org JSON 建立在两个结构之上: • 名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。 • 有序的值列表。在大多数语言中,这被实现为数组、向量、列表或序列。 如果您仍然认为有问题,可以在 jsonlint.com 上查看。

【讨论】:

    【解决方案2】:

    试试这个

      $.ajax({
        url: url,
        type: 'POST',
        datatype: "json",
        traditional: true,
        data: { 
            menuItems: JSON.stringify(myArray),
                    },
        success: function () { window.alert('success'); },
        error: function (event, request, settings) {  
            window.alert('error'); },
        timeout: 20000
     });
    

    【讨论】:

    • 它不是 php 代码...你应该使用 JSON.stringify(array) 然后发送到 ajax 数据并使用 dataType 作为“json”
    • 我尝试只对数组进行字符串化,但后来我得到了 {"hobbies": "["apples", "dogs"]"}。另外,dataType 实际上不是响应的预期数据类型,而不是请求吗?
    • @user3391564 我想这就是你想要的。对于响应的预期数据类型,而不是请求,您所说的 dataType 是什么意思?
    • 我认为设置 dataType 对请求没有影响,而是对数据的解释以及传递给成功函数的对象产生影响。使用您建议的代码,我仍然可以得到所有的\。传统的:true 似乎并没有改变这一点。
    猜你喜欢
    • 2019-03-28
    • 2019-01-06
    • 2014-06-06
    • 2021-05-06
    • 1970-01-01
    • 2021-10-07
    • 2014-12-06
    相关资源
    最近更新 更多