页面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
});
Run Code Online (Sandbox Code Playgroud)
实际发送到服务器的请求的内容:
{"NumberOfCPUs":"2","NumberOfCores":"4","OSType":"Linux","OSVersion":"jQuery19107363727174233645_1373301489648?"}
Run Code Online (Sandbox Code Playgroud)
怎么了?是字符串"???" 某种特殊的控制词或jQuery中的某些东西?
谢谢.
Sum*_*ai8 11
如果我通读其他答案中的错误评论,真正的问题在于你在传递json字符串之前将其字符串化data
.data
期望String
包含查询(例如,"a=asdf&b=qwer"
或Object
包含将变成查询的键和值).您正在传递类似的内容'{"a":"asdf","b":"qwer"}'
,String
包含不是查询的字符串化数组.它以某种方式设法转换服务器理解的数据,但显然也会触发该错误/功能.
解决方案1
如果要通过$_POST['a']
get 访问数据来获取"a"
JSON对象中的键:
$.ajax( {
async: false,
data: model, //Pass the Array itself to the function
dataType: "json",
type: "post",
url: serverSideURL
});
Run Code Online (Sandbox Code Playgroud)
解决方案2
如果要检索JSON字符串:
$.ajax( {
async: false,
data: {
"MyLilString": JSON.stringify( model )
}
dataType: "json",
type: "post",
url: serverSideURL
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,$_POST["MyLilString"]
包含序列化的JSON,您可以使用json_decode()
它.
另一个消化
我从评论中提取的另一个建议(但我现在无法找到-_-')是设置jsonp
为false
.
$.ajax( {
async: false,
data: model
dataType: "json",
type: "post",
url: serverSideURL,
jsonp: false
});
Run Code Online (Sandbox Code Playgroud)
这应该会阻止jQuery将回调函数插入到请求体中.
?? 用作 jsonp 请求数据中的回调名称占位符。因此,找到它后,jQuery 会将您的请求“提升”为 jsonp。
jquery bug 跟踪器,票号 #12326
使用此属性
contentType: "application/json; charset=utf-8"
Run Code Online (Sandbox Code Playgroud)