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,来对我的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 Markers)
{
  return "Received " + Markers.Count + " markers.";
}

如果你愿意,你也可以接受一个数组,如Marker[] Markers。 ASMX ScriptServices使用的反序列化器(JavaScriptSerializer)相当灵活,它将尽其所能把你的输入数据转换成你指定的服务器端类型。

评论(13)

1.markers不是一个JSON对象。它是一个普通的JavaScript对象。 2.2. 阅读关于data:选项

要发送到服务器的数据。如果不是一个字符串,它将被转换为**查询字符串。

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

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

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


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

return "\"received markers\"";

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

评论(9)

我也遇到过这个问题,这是我的解决办法。

如果你在解析数据时遇到无效的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 ...
评论(0)