页面javascript:
var model = {"NumberOfCPUs":"2","NumberOfCores":"4","OSType":"Linux","OSVersion":"???"};
var id = 0;
var success = false;
//send to server:
$.ajax(
{
async: false,
data: JSON.stringify(model),
dataType: "json",
type: "post",
url: serverSideURL
});
实际发送到服务器的请求的内容:
{"NumberOfCPUs":"2","NumberOfCores":"4","OSType":"Linux","OSVersion":"jQuery19107363727174233645_1373301489648?"}
发生了什么事?是字符串“???”在jQuery中使用某种特殊的控制字?
感谢。
答案 0 :(得分:11)
如果我仔细阅读其他答案中的错误评论,那么真正的问题就在于,在将json-string传递给data
之前对其进行字符串化。 data
要求包含查询的String
(例如"a=asdf&b=qwer"
或Object
包含将变为查询的键和值。您正在传递类似'{"a":"asdf","b":"qwer"}'
的内容,String
包含不是查询的字符串化数组。它以某种方式设法转换服务器理解的数据,但显然也会触发该错误/功能。
解决方案1
如果您想通过$_POST['a']
访问数据,以获取JSON对象中的密钥"a"
:
$.ajax( {
async: false,
data: model, //Pass the Array itself to the function
dataType: "json",
type: "post",
url: serverSideURL
});
(Source; Cowboy on jQuery bugs)
解决方案2
如果要检索JSON字符串:
$.ajax( {
async: false,
data: {
"MyLilString": JSON.stringify( model )
}
dataType: "json",
type: "post",
url: serverSideURL
});
在这种情况下,$_POST["MyLilString"]
包含序列化的JSON,您可以使用json_decode()
。
(Source; Ajpiano on jQuery bugs)
另一种消化
我从评论中提取的另一个建议(但我现在无法找到-_-')是将jsonp
设置为false
。
$.ajax( {
async: false,
data: model
dataType: "json",
type: "post",
url: serverSideURL,
jsonp: false
});
这应该会阻止jQuery将回调函数插入到请求体中。
答案 1 :(得分:3)
??用作jsonp数据中的回调名称占位符 要求。所以,找到它,jQuery将推广"你的请求是jsonp。
jquery bug tracker,ticket #12326
使用此属性
contentType: "application/json; charset=utf-8"
答案 2 :(得分:0)
这是known bug:
发布AJAX时数据有“??”格式化它 jQuery的?
它被标记为固定,即使在对错误的评论中它显然从未被修复过。这个问题应该重新开放。
变通方法显然包括将您的JSON行更改为以下内容:
var model = {NumberOfCPUs:"2",NumberOfCores:"4",OSType:"Linux",OSVersion:"???"};
并允许它被序列化。这样它就不会触发导致双问号被替换的正则表达式。