jQuery的Ajax发布json到webservice

我想发布一个JSON对象到一个asp.net的web服务。

我的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基元:

我发现一堆与此有关的post,这似乎是一个非常普遍的问题,但我没有尝试修复这个问题。

当萤火虫什么是张贴到服务器它看起来像这样:

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

我正在调用的web服务函数是:

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

您提到使用json2.js来对您的数据进行string化,但是发布的数据似乎是URLEncoded JSON您可能已经看到了它,但是这篇关于无效的JSON基元的文章覆盖了为什么JSON正在被URLEncoded。

我build议不要传递一个原始的,手动序列化的JSONstring到你的方法 。 ASP.NET将会自动JSON反序列化请求的POST数据,所以如果你手动序列化和发送一个JSONstring到ASP.NET,你实际上最终不得不JSON序列化你的JSON序列化string。

我会build议更多的这些方面的东西:

 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传递给data参数的JSONstring,而不是JavaScript对象,以便jQuery不会试图URLEncode您的数据。

在服务器端,将您的方法的input参数与您传递的数据的形状匹配:

 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)非常灵活,并将尽其所能将input数据转换为您指定的服务器端types。

  1. markers不是JSON对象。 这是一个正常的JavaScript对象。
  2. 阅读有关data:选项 :

    要发送到服务器的数据。 它被转换成一个查询string ,如果还不是一个string。

如果你想发送数据为JSON,你必须先编码它:

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

jQuery不会自动将对象或数组转换为JSON。


但是我认为错误信息来自解释服务的响应。 您发回的文本不是JSON。 JSONstring必须用双引号括起来。 所以你必须这样做:

 return "\"received markers\""; 

我不确定您的实际问题是发送还是接收数据。

我也遇到过这个,这是我的解决scheme。

如果在parsing数据时遇到无效的json对象exception,即使您知道您的jsonstring是正确的,请在将其parsing为JSON之前将您在ajax代码中收到的数据string化:

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

我试过戴夫沃德的解决scheme。 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); } }); 

请按照这个由ajax调用java的web服务

 var param = { priceGroupId : priceGroupId, divId : selectedDivId, priceGroupName : $('#priceGroupName').val(), priceGroupDescription : $('#desc').val(), indexNumber : $('#indexNumber').val(), priceList : priceGroupId == 0 ? '' : priceList <%-- <% for(int index=0;index<10;index++){%> priceList[<%=index%>].regularSellPrice : $('#storePrice_<%=index%>').val(), <%}%> priceList[10].regularSellPrice : $('#storePrice_10').val() --%> } $.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); } }); //any idea about when variable of javascript has list object of another list //Like, var priceList = []; for(var index=0;index<priceListLength;index++){ if(initPriceListLength == 0){ priceGroupStoreId = 0; } priceList.push({ regularSellPrice : $('#storePrice_'+index).val(), rebateAmount : $('#rebateAmount_'+index).val(), storeId : $('#storeId_'+index).val(), storeName : $('#storeName_'+index).val(), postponeDate : $('#datePostpone').val(), }); }