使用包含“???”的字符串提交jQuery.ajax数据,它将值更改为“jQuery19107363727174233645_1373301489648?”

页面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中某种特殊控制词或某些东西?

谢谢。

如果我仔细阅读其他答案中的错误评论, 真正的问题在于,在将json-string传递给data之前将其字符串化。 data需要一个包含查询的String (例如"a=asdf&b=qwer"或包含它将成为查询的键和值的Object 。 而是传递类似'{"a":"asdf","b":"qwer"}'String包含不是查询的字符串化数组。 它以某种方式设法转换服务器理解的数据,但显然也会触发该错误/function。

解决方案1

如果要通过$_POST['a']访问数据,以获取JSON对象中的键"a"

 $.ajax( { async: false, data: model, //Pass the Array itself to the function dataType: "json", type: "post", url: serverSideURL }); 

( 来源;关于jQuery错误的牛仔 )

解决方案2

如果要检索JSON字符串:

 $.ajax( { async: false, data: { "MyLilString": JSON.stringify( model ) } dataType: "json", type: "post", url: serverSideURL }); 

在这种情况下, $_POST["MyLilString"]包含序列化的JSON,您可以使用json_decode()

( 来源;关于jQuery错误的Ajpiano )

另一个消化

我从评论中提取的另一个建议(但我现在无法找到-_-‘)是将jsonp设置为false

 $.ajax( { async: false, data: model dataType: "json", type: "post", url: serverSideURL, jsonp: false }); 

这应该会阻止jQuery将回调函数插入到请求体中。

?? 用作jsonp请求数据中的回调名称占位符。 所以,找到它,jQuery将“推广”你的请求作为jsonp。

jquery bug tracker, 门票#12326

使用此属性

 contentType: "application/json; charset=utf-8" 

这是一个已知的错误 :

发布AJAX时数据有“??” 将它格式化为jQuery?

它被标记为固定,即使在对错误的评论中它显然从未被修复过。 该问题应该重新开放。

解决方法显然包括将您的JSON行更改为以下内容:

 var model = {NumberOfCPUs:"2",NumberOfCores:"4",OSType:"Linux",OSVersion:"???"}; 

并允许它被序列化。 这样它就不会触发导致双问号被替换的正则表达式。