Jquery Ajax将JSON发布到webservice

Jquery Ajax将JSON发布到webservice,jquery,ajax,web-services,json,Jquery,Ajax,Web Services,Json,我正在尝试将JSON对象发布到asp.net Web服务 $.ajax({ type: "POST", url: "/webservices/PodcastService.asmx/CreateMarkers", data: markers, contentType: "application/json; charset=utf-8", dataType

我正在尝试将JSON对象发布到asp.net 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如下所示:

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发布到服务器时,它看起来如下所示:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};
标记%5B0%5D%5b位置%5D=128.3657142857143&标记%5B0%5D%5b位置%5D=7&标记%5B1%5D%5b位置%5D=235.19440233315&标记%5B1%5D位置%5D=19&标记%5B2%5D位置%5D=42.5978231292517&标记%5B2%5D位置%5D位置=3

正在调用的我的webservice函数是:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
  • 标记
    不是JSON对象。它是一个普通的JavaScript对象
  • : 要发送到服务器的数据。如果尚未转换为字符串,则会将其转换为查询字符串

  • 如果要将数据作为JSON发送,必须首先对其进行编码:

    data: {markers: JSON.stringify(markers)}
    
    jQuery不会自动将对象或数组转换为JSON


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

    return "\"received markers\"";
    

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

    您提到使用json2.js对您的数据进行字符串化,但是发布的数据似乎是URLEncoded JSON,您可能已经看到了,但介绍了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);},
        error: function(errMsg) {
            alert(errMsg);
        }
    });
    
    避免无效JSON原语问题的关键是向jQuery传递
    数据
    参数的JSON字符串,而不是JavaScript对象,这样jQuery就不会尝试对数据进行URL编码

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

    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.";
    }
    
    公共类标记
    {
    公共小数位置{get;set;}
    公共整数标记位置{get;set;}
    }
    [网络方法]
    公共字符串创建标记(列表标记)
    {
    返回“已接收”+标记。计数+“标记。”;
    }
    

    如果愿意,还可以接受数组,如
    标记[]标记
    。ASMX ScriptServices使用的反序列化程序(JavaScriptSerializer)非常灵活,可以将输入数据转换为您指定的服务器端类型。

    我也遇到过这个问题,这是我的解决方案

    如果在解析数据时遇到无效的json对象异常,即使您知道json字符串是正确的,也要在将ajax代码中接收的数据解析为json之前对其进行字符串化:

    $.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 变量参数={ feildName:feildValue }; stringify({data:param})

    $.ajax({
    数据类型:“json”,
    键入:“POST”,
    contentType:'应用程序/json',
    url:“/rest/priceGroups”,
    data:JSON.stringify({data:param}),
    成功:功能(res){
    如果(res.success==true){
    $('#alertMessage').html('已成功创建价格组').addClass('警报成功淡入');
    $('#alertMessage')。removeClass('alert-danger alert info');
    initPriceGroupsList();
    priceGroupId=0;
    resetForm();
    }否则{
    $('#alertMessage').html(res.message).addClass('alert-alert-danger-fade-in');
    }
    $('#alertMessage').alert();
    setTimeout(函数(){
    $('#alertMessage')。removeClass('in');
    document.getElementById('message').style.display='none';
    }, 5000);
    }
    });
    
    感谢您对Felix的帮助,我认为通过JSON.stringyfy方法运行标记,我将其转换为查询字符串,我已经按照你的建议做了,但不幸的是,我没有发布以下。标记=%7B%22标记%22%3A%5B%7B%22位置%22%3A%22128.3657142857143%22%2C%22%3A%227%22%7D%2C%7B%22位置%3A%22235.19440233615%22%2C位置%22%3A%2219%22%7D%2C%22b位置%22%3A%2242.5978231292517%22%2C%22c位置%22%3A%22%22%3%7D%5D%7D@Dreamguts当前位置我不太清楚你想要什么。您想将标记作为JSON字符串发送吗?您好,Felix,是的,我想将标记对象作为JSON字符串发送,这样我就可以在我的Web服务中使用它了。@Dreamguts:那么它应该是这样工作的。此外,您在评论中发布的“代码”看起来还可以。当然,您必须在服务器端对其进行正确解码,也许您必须更改参数的名称,我不知道。您编写了“以便jQuery不会尝试对数据进行URL编码”,但这是不正确的。要阻止jquery对数据进行URL编码,必须将processData设置为false。传入字符串足以阻止jquery对数据参数进行URL编码。您可以将processData设置为false,但这是多余的(仅此操作而不为数据传递JSON字符串是不够的)