2011-06-12 162 views
183

我想發佈一個JSON對象到asp.net web服務。Jquery Ajax發佈json到webservice

我的JSON是這樣的:

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

我使用json2.js到stringyfy我的JSON對象。

我正在使用jquery將其發佈到我的web服務。

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

我收到以下錯誤:

「無效的JSON原始:

我發現了一堆關於這個職位的,它似乎是一個很常見的問題,但沒有我嘗試修復該問題

當螢火蟲什麼被髮送到服務器,它看起來是這樣的:

markers%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3

正被調用我的web服務的功能是:

[WebMethod] 
public string CreateMarkers(string markerArray) 
{ 
    return "received markers"; 
} 
+0

「失敗」不提供作爲一個可能的設置在那些在http://api.jquery.com/jQuery.ajax/ ...上市也許你錯了它「錯誤」呢? – danicotra 2013-11-02 14:32:46

回答

314

您提到使用json2.js來對您的數據進行串聯,但發佈的數據看起來是URLEncoded JSON您可能已經看到了它,但this post about the invalid JSON primitive涵蓋了爲何JSON正在被URLEncoded。我想advise against passing a raw, manually-serialized JSON string into your method。 ASP.NET將自動將JSON反序列化爲請求的POST數據,因此如果您手動序列化並將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的JSON字符串爲data參數,而不是一個JavaScript對象,這樣的jQuery不會嘗試對您的數據進行URLEn編碼。

在服務器端,匹配您的方法的輸入參數,你傳遞數據的形狀:

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)非常靈活,並將盡其所能將輸入數據轉換爲您指定的服務器端類型。

+0

完蛋了!非常感謝您詳細的答覆! – 2011-06-12 17:57:38

+3

你寫「讓jQuery不會嘗試來urlencode您的數據。」,但它是不正確的。從URL編碼數據停止的jQuery你必須設置processData爲false – Softlion 2011-10-20 08:58:17

+8

傳遞一個字符串足以阻止jQuery對URLEncoding數據參數進行編碼, sData爲false,但它是多餘的(並且單獨這樣做,不傳遞數據的JSON字符串是不夠的)。 – 2011-10-20 16:16:36

11
  1. markers不是一個JSON對象。這是一個普通的JavaScript對象。
  2. Read about the data: option

    Data to be sent to the server. It is converted to a query string, if not already a string.

如果你要發送的數據作爲JSON,你必須先對其進行編碼:

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

的jQuery沒有對象或數組自動轉換成JSON。


但我假設錯誤消息來自解釋服務的響應。您發回的文本不是JSON。 JSON字符串必須用雙引號括起來。所以你必須這樣做:

return "\"received markers\""; 

我不確定你的實際問題是發送還是接收數據。

+0

感謝您的幫助菲利克斯,我認爲通過運行標記通過JSON.stringyfy方法我把它轉換爲查詢字符串,我已經按照你的建議,但不幸它不工作,我不張貼以下內容。 – 2011-06-12 17:33:12

+0

標記=%7B%22標記%22%3A%5B%7B%22位置22%3A%22128.3657142857143%22%2C%22標記位置%22%3A%227%22%7D%2C%7B%22位置%22%3A% 22235.1944023323615%22%2C%22markerPosition%22%3A%2219%22%7D%2C%7B%22position%22%3A%2242.5978231292517%22%2C%22markerPosition%22%3A%22-3%22%7D%5D% 7D – 2011-06-12 17:33:19

+0

@Dreamguts:我有點不清楚你想要什麼。你想發送'標記'作爲JSON字符串嗎? – 2011-06-12 17:34:33

2

我也遇到過這個,這是我的解決方案。

如果您正在分析數據時,即使你知道你的JSON字符串是正確遇到一個無效的JSON對象例外,字符串化你把它解析爲JSON之前,你的Ajax代碼接收到的數據:

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

我試過戴夫沃德的解決方案。由於contentType設置爲"application/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); 
    } 
}); 
-1

請通過Ajax調用按照這個對Java的web服務的

$.ajax({ 
      dataType : 'json', 
      type  : 'POST', 
      contentType : 'application/json', 
      url   : '<%=request.getContextPath()%>/rest/priceGroups', 
      data  : JSON.stringify({data : param}), 
      success  : function(res) { 
       if(res.success == true){ 
        $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in'); 
        $('#alertMessage').removeClass('alert-danger alert-info'); 
        initPriceGroupsList(); 
        priceGroupId = 0; 
        resetForm();                  
       }else{       
        $('#alertMessage').html(res.message).addClass('alert alert-danger fade in'); 
       } 
       $('#alertMessage').alert();   
       window.setTimeout(function() { 
        $('#alertMessage').removeClass('in'); 
        document.getElementById('message').style.display = 'none'; 
       }, 5000); 
      } 
     }); 
+0

這裏如何將json對象傳遞給java webservice的ajax調用。 – 2016-01-29 12:43:53

0

我有查詢,

$("#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

這不是問題的答案。如果你想問問題,那麼進入「問題」菜單並點擊「問題問題」,如果你的問題與這個問題有關,那麼在你的問題中提供參考鏈接。 – Mittal 2018-01-23 04:10:09

+1

如果您有新問題,請點擊[Ask Question](問問題)(https://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/18595928) – VKen 2018-01-23 04:22:44