我试图将一个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,来对我的json对象进行串联。
我正在使用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);
}
});
我得到了以下错误。
"无效的JSON原语。
我找到了很多与此相关的帖子,这似乎是一个非常普遍的问题,但我尝试的任何方法都无法解决这个问题。
当firebug将什么发布到服务器上时,它看起来像这样。
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
我的网络服务函数正在被调用。
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
你提到使用json2.js来串联你的数据,但是POST的数据似乎是URLEncoded JSON 你可能已经看到了,但是这个关于无效JSON原语的帖子涵盖了为什么JSON被URLEncoded。
我建议不要将原始的、手动序列化的JSON字符串传入你的方法中]2。 ASP.NET将自动对请求的POST数据进行JSON反序列化,所以如果你手动序列化并向ASP.NET发送一个JSON字符串,你最终将不得不对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的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)相当灵活,它将尽其所能把你的输入数据转换成你指定的服务器端类型。
1.markers
不是一个JSON对象。它是一个普通的JavaScript对象。
2.2. 阅读关于data:
选项。
要发送到服务器的数据。如果不是一个字符串,它将被转换为**查询字符串。
如果你想以JSON格式发送数据,你必须先对它进行编码。
data: {markers: JSON.stringify(markers)}
jQuery不会自动将对象或数组转换为JSON。
但我认为错误信息来自于解释服务的响应。你发回的文本不是JSON。JSON字符串必须用双引号括起来。所以你必须这样做。
return "\"received markers\"";
我不确定你的实际问题是发送还是接收数据。
我也遇到过这个问题,这是我的解决办法。
如果你在解析数据时遇到无效的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 ...