2011-06-12 125 views
183

我想发布一个JSON对象到asp.net web服务。Jquery Ajax发布json到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将其发布到我的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原始:

我发现了一堆关于这个职位的,它似乎是一个很常见的问题,但没有我尝试修复该问题

当萤火虫什么被发送到服务器,它看起来是这样的:

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

正被调用我的web服务的功能是:

[WebMethod] 
public string CreateMarkers(string markerArray) 
{ 
    return "received markers"; 
} 
+0

“失败”不提供作为一个可能的设置在那些在http://api.jquery.com/jQuery.ajax/ ...上市也许你错了它“错误”呢? – danicotra 2013-11-02 14:32:46

回答

314

您提到使用json2.js来对您的数据进行串联,但发布的数据看起来是URLEncoded JSON您可能已经看到了它,但this post about the invalid JSON primitive涵盖了为何JSON正在被URLEncoded。我想advise against passing a raw, manually-serialized JSON string into your method。 ASP.NET将自动将JSON反序列化为请求的POST数据,因此如果您手动序列化并将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原始问题的关键是通过jQuery的JSON字符串为data参数,而不是一个JavaScript对象,这样的jQuery不会尝试对您的数据进行URLEn编码。

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

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

+0

完蛋了!非常感谢您详细的答复! – 2011-06-12 17:57:38

+3

你写“让jQuery不会尝试来urlencode您的数据。”,但它是不正确的。从URL编码数据停止的jQuery你必须设置processData为false – Softlion 2011-10-20 08:58:17

+8

传递一个字符串足以阻止jQuery对URLEncoding数据参数进行编码, sData为false,但它是多余的(并且单独这样做,不传递数据的JSON字符串是不够的)。 – 2011-10-20 16:16:36

11
  1. markers不是一个JSON对象。这是一个普通的JavaScript对象。
  2. Read about the data: option

    Data to be sent to the server. It is converted to a query string, if not already a string.

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

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

的jQuery没有对象或数组自动转换成JSON。


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

return "\"received markers\""; 

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

+0

感谢您的帮助菲利克斯,我认为通过运行标记通过JSON.stringyfy方法我把它转换为查询字符串,我已经按照你的建议,但不幸它不工作,我不张贴以下内容。 – 2011-06-12 17:33:12

+0

标记=%7B%22标记%22%3A%5B%7B%22位置22%3A%22128.3657142857143%22%2C%22标记位置%22%3A%227%22%7D%2C%7B%22位置%22%3A% 22235.1944023323615%22%2C%22markerPosition%22%3A%2219%22%7D%2C%7B%22position%22%3A%2242.5978231292517%22%2C%22markerPosition%22%3A%22-3%22%7D%5D% 7D – 2011-06-12 17:33:19

+0

@Dreamguts:我有点不清楚你想要什么。你想发送'标记'作为JSON字符串吗? – 2011-06-12 17:34:33

2

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

如果您正在分析数据时,即使你知道你的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 ... 
2

我试过戴夫沃德的解决方案。由于contentType设置为"application/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); 
    } 
}); 
-1

请通过Ajax调用按照这个对Java的web服务的

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

这里如何将json对象传递给java webservice的ajax调用。 – 2016-01-29 12:43:53

0

我有查询,

$("#login-button").click(function(e){ alert("hiii"); 

     var username = $("#username-field").val(); 
     var password = $("#username-field").val(); 

     alert(username); 
     alert("password" + password); 



     var markers = { "userName" : "admin","password" : "admin123"}; 
     $.ajax({ 
      type: "POST", 
      url: url, 
      // The key needs to match your method's input parameter (case-sensitive). 
      data: JSON.stringify(markers), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(data){alert("got the data"+data);}, 
      failure: function(errMsg) { 
       alert(errMsg); 
      } 
     }); 

    }); 

我张贴在JSON的登录信息,并得到一个字符串作为"Success",但我没有得到回应。

+1

这不是问题的答案。如果你想问问题,那么进入“问题”菜单并点击“问题问题”,如果你的问题与这个问题有关,那么在你的问题中提供参考链接。 – Mittal 2018-01-23 04:10:09

+1

如果您有新问题,请点击[Ask Question](问问题)(https://stackoverflow.com/questions/ask)按钮。如果有助于提供上下文,请包含此问题的链接。 - [来自评论](/ review/low-quality-posts/18595928) – VKen 2018-01-23 04:22:44