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

时间:2013-07-08 16:52:05

标签: jquery ajax json

页面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中使用某种特殊的控制字?

感谢。

3 个答案:

答案 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:"???"};

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