Jquery Ajax发布JSON到webservice

我试图发布一个JSON对象到asp.net 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发布它到我的webservice。

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

我发现了一堆与此相关的帖子,这似乎是一个非常普遍的问题,但我没有尝试解决这个问题。

当firebug被发布到服务器时,它看起来是这样的:

标记% 5 b0 % 5 d % 5 bposition % 5 d = 128.3657142857143,标记% 5 b0 % 5 d % 5 bmarkerposition % 5 d = 7,标记% 5 b1 % 5 d % 5 bposition % 5 d = 235.1944023323615,标记% 5 b1 % 5 d % 5 bmarkerposition % 5 d = 19,标记% 5 b2 % 5 d % 5 bposition % 5 d = 42.5978231292517,标记% 5 b2 % 5 d % 5 bmarkerposition % 5 d = 3

我的webservice函数被调用是:

[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
601954 次浏览
  1. markers不是一个JSON对象。它是一个普通的JavaScript对象。
  2. <李> 阅读有关data:选项的信息:

    要发送到服务器的数据。如果不是字符串,则转换为查询字符串

如果你想以JSON的形式发送数据,你必须先对它进行编码:

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

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


但是我假设错误消息来自于解释服务的响应。您发回的文本不是JSON。JSON字符串必须用双引号括起来。所以你必须这样做:

return "\"received markers\"";

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

你提到使用json2.js来stringify你的数据,但post的数据似乎是URLEncoded JSON你可能已经见过它,但这篇文章关于无效的JSON原语涵盖了为什么JSON是URLEncoded。

建议反对传递一个原始的,手动序列化的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);},
error: function(errMsg) {
alert(errMsg);
}
});

避免无效JSON原语问题的关键是向jQuery传递data参数的JSON字符串,而不是JavaScript对象,这样jQuery就不会尝试对数据进行URLEncode。

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

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)非常灵活,可以将输入数据转换为您指定的服务器端类型。

我也遇到过这种情况,这就是我的解。

如果你在解析数据时遇到了一个无效的json对象异常,即使你知道你的json字符串是正确的,在解析到json之前,将你在ajax代码中接收到的数据进行stringify:

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

我尝试了戴夫·沃德的解决方案。由于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的webservice Var参数= { feildName: feildValue }; JSON。Stringify ({data: param})

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