jquery - 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对我的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原语:
我发现了很多与此相关的帖子,这似乎是一个很常见的问题,但我没有尝试解决这个问题。
当Firebug发布到服务器时,它看起来是这样的:
标记%5b0%5d%5bposition%5d=128.3657142857143&标记%5b0%5d%5bmarkerposition%5d=7&标记%5b1%5d%5bposition%5d=235.1944023323615&标记%5b1%5d%5b markerposition%5d=19&标记%5b2%5d%5bposition%5d=42.5978231292517&标记%5b2%5d%5bmarkerposition%5d=-3
正在调用的WebService函数是:
[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}


最佳答案:

您提到过使用json2.js对数据进行字符串化,但是发布的数据似乎是经过urlencoded的json,您可能已经看到了它,但是this post about the invalid JSON primitive涵盖了为什么json被urlencoded。
我会的。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);},
    failure: function(errMsg) {
        alert(errMsg);
    }
});

避免无效json原语问题的关键是为data参数传递jquery一个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脚本服务使用的反序列化程序(javascriptserializer)非常灵活,它将尽其所能将输入数据转换为指定的服务器端类型。

评论