8

页面端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中的某种特殊控制字或其他东西?

谢谢。

4

3 回答 3

11

如果我通读其他答案中的错误评论,真正的问题在于您在将 json-string 传递给data. data期望 aString包含查询(例如"a=asdf&b=qwer",或Object包含将变成查询的键和值)。相反,您传递的内容类似于'{"a":"asdf","b":"qwer"}', aString包含不是查询的字符串化数组。它以某种方式设法转换服务器理解的数据,但显然也触发了该错误/功能。

解决方案 1

如果您想通过$_POST['a']获取"a"JSON 对象中的密钥来访问数据:

$.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

另一个建议

我从评论中提取的另一个建议(但我现在找不到 -_-')是设置jsonpfalse.

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

这也应该阻止 jQuery 将回调函数插入到请求正文中。

于 2013-07-08T18:27:19.373 回答
3

?? 用作 jsonp 请求数据中的回调名称占位符。因此,找到它,jQuery 会将您的请求“提升”为 jsonp。

jquery 错误跟踪器,票证 #12326

使用此属性

contentType: "application/json; charset=utf-8"
于 2013-07-08T17:00:42.200 回答
0

这是一个已知的错误

发布 AJAX 时,数据有“??” 是否将其格式化为 jQuery?

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

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

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

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

于 2013-07-08T17:04:10.260 回答