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。
-
markers
不是JSON对象。 这是一个正常的JavaScript对象。 - 阅读有关
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(), }); }