web-dev-qa-db-ja.com

Jquery Ajax Webサービスへのjsonの投稿

私はJSONオブジェクトをasp.net Webサービスに投稿しようとしています。

私のjsonはこのように見えます:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

私のjsonオブジェクトをstringyfyするためにjson2.jsを使っています。

そして私はそれを私のウェブサービスに投稿するためにjqueryを使っています。

  $.ajax({
        type: "POST",
        url: "/webservices/PodcastService.asmx/CreateMarkers",
        data: markers,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){alert(data);},
        failure: function(errMsg) {
            alert(errMsg);
        }
  });

次のようなエラーが表示されます。

msgstr "無効なJSONプリミティブ:

私はこれに関連するたくさんの投稿を見つけました、そしてそれは本当に一般的な問題であるように思われます、しかし私が試みるものは何も問題を解決しません。

Firebugをすると、サーバーに投稿されたものは次のようになります。

マーカー%5B0%5D%5Bposition%5D = 128.3657142857143&マーカー%5B0%5D%5BmarkerPosition%5D = 7& 5D = 42.5978231292517&マーカー%5B2%5D%5BmarkerPosition%5D = -3

呼び出されている私のWebサービス関数は次のとおりです。

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
217
Code Pharaoh

Json2.jsを使用してデータを文字列化することについて言及しましたが、POSTされたデータはURLEncoded JSONのように見えますが、すでに見たかもしれませんが、 無効なJSONプリミティブに関するこの投稿 はJSONがURLEncodedである理由をカバーしています。

アドバイスagainst手動でシリアル化された生のJSON文字列をメソッドに渡す ASP.NETはリクエストのPOSTデータを自動的にJSONシリアル化解除するため、JSON文字列を手動でシリアル化してASP.NETに送信する場合、実際にはJSONシリアル化されたJSONをシリアル化する必要があります文字列。

私はこれらの線に沿ってもっと何かを提案したいと思います:

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
               { "position": "235.1944023323615", "markerPosition": "19" },
               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({
    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }
});

無効なJSONプリミティブの問題を回避する鍵は、jQueryがデータをURLEncodeしようとしないように、jQueryにJavaScriptオブジェクトではなくdataパラメーターのJSON文字列を渡すことです。

サーバー側で、メソッドの入力パラメーターを、渡すデータの形状に一致させます。

public class Marker
{
  public decimal position { get; set; }
  public int markerPosition { get; set; }
}

[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
  return "Received " + Markers.Count + " markers.";
}

必要に応じて、Marker[] Markersなどの配列を受け入れることもできます。 ASMX ScriptServicesが使用するデシリアライザー(JavaScriptSerializer)は非常に柔軟であり、入力データを指定したサーバー側の型に変換するためにできることを行います。

369
Dave Ward
  1. markersはJSONオブジェクトではありません。通常のJavaScriptオブジェクトです。
  2. data:オプションについて読む

    サーバーに送信されるデータ。まだ文字列でない場合は、 クエリ文字列 に変換されます。

データをJSONとして送信したい場合は、まずそれをエンコードする必要があります。

data: {markers: JSON.stringify(markers)}

jQueryはオブジェクトや配列をJSONに自動的に変換しません。


しかし、私はエラーメッセージがサービスの応答を解釈することから来ると思います。返信するテキストはJSONではありません。 JSON文字列は二重引用符で囲む必要があります。だからあなたはしなければならないでしょう:

return "\"received markers\"";

あなたの実際の問題がデータを送信しているのか受信しているのか私にはわかりません。

14
Felix Kling

私はDave Wardの解決策を試しました。 contentType "application/json"に設定されているため、データ部分はpostリクエストのペイロード部分でブラウザから送信されていませんでした。この行を削除すると、すべてうまくいった。

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },

               { "position": "235.1944023323615", "markerPosition": "19" },

               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({

    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }
});
2
Usha

私もこれに遭遇しましたが、これが私の解決策です。

データの解析時に無効なjsonオブジェクト例外が発生した場合は、json文字列が正しいことがわかっていても、受け取ったデータをajaxコードで文字列化してからJSONに解析してください。

$.post(CONTEXT+"servlet/capture",{
        yesTransactionId : yesTransactionId, 
        productOfferId : productOfferId
        },
        function(data){
            try{
                var trimData = $.trim(JSON.stringify(data));
                var obj      = $.parseJSON(trimData);
                if(obj.success == 'true'){ 
                    //some codes ...
2

私は質問があります、

$("#login-button").click(function(e){ alert("hiii");

        var username = $("#username-field").val();
        var password = $("#username-field").val();

        alert(username);
        alert("password" + password);



        var markers = { "userName" : "admin","password" : "admin123"};
        $.ajax({
            type: "POST",
            url: url,
            // The key needs to match your method's input parameter (case-sensitive).
            data: JSON.stringify(markers),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert("got the data"+data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
        });

    });

ログインの詳細をjsonに投稿して"Success"という文字列を取得していますが、応答がありません。

1
Priya B