发送带有包含列表的 json 数据的 post 请求

Posted

技术标签:

【中文标题】发送带有包含列表的 json 数据的 post 请求【英文标题】:sending a post request with json data that contains a list 【发布时间】: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 -- 这里还有一些背景资料:***.com/questions/2845459/… @mgilson 服务器希望将其作为原始的、未转义的 json 获取,例如 "firstname": "bill"... 等,但如有必要可能会改变。我将尝试博客文章中的代码。 在这里查看答案:***.com/questions/16574482/… @user3391564 -- 我怀疑它收到了一个空请求。问题是大多数框架都需要 x-www-form-urlencoded 数据。如果您实际查看请求 body,JSON 将在其中(您可能需要自己解析)。我最近在处理来自 angular 的 $http 的请求时遇到了这个问题(因为它将 json 发布为 application/json 这实际上是有道理的......) 【参考方案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 似乎并没有改变这一点。

以上是关于发送带有包含列表的 json 数据的 post 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 Volley 发送带有 JSON 数据的 POST 请求

在 Laravel 中发送带有 json 对象数据的 post 请求

使用 Alamofire 发送包含图像和 json 的发布请求

如何在 jmeter 的 post 请求中发送 csv 文件或 json 数据?

如何发送带有 URL 参数和 JSON 正文的 POST? [关闭]

nodejs从POST请求中获取原始正文[重复]