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いずれかを期待します。代わりに、クエリではない文字列化された配列を含む のようなものを渡しています。サーバーが理解できるデータに変換することはなんとかできますが、明らかにそのバグ/機能もトリガーします。String"a=asdf&b=qwer"Object'{"a":"asdf","b":"qwer"}'String

解決策 1

JSON オブジェクトの$_POST['a']キーを取得するためにデータにアクセスする場合:"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 がコールバック関数をリクエスト本文に挿入するのも停止するはずです。

于 2013-07-08T18:27:19.373 に答える
3

?? jsonp リクエストのデータでコールバック名のプレースホルダーとして使用されます。したがって、それを見つけると、jQuery はリクエストを jsonp として「昇格」します。

jquery バグトラッカー、チケット #12326

このプロパティを使用します

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