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

Mat*_*Dev 8 ajax jquery 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

            });
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)

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

解决方案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()它.

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

另一个消化

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

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

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


Ily*_*lya 3

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

jquery bug 跟踪器,票号 #12326

使用此属性

contentType: "application/json; charset=utf-8"
Run Code Online (Sandbox Code Playgroud)