我试图发布一个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来stringyfy我的JSON对象。

我使用jquery发布它到我的webservice。

  $.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&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页

我的webservice函数被调用是:

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

当前回答

请按此使用ajax调用java的webservice Var参数= { feildName: feildValue }; JSON。Stringify ({data: param})

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

其他回答

我尝试了戴夫·沃德的解决方案。由于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);
    }
});

标记符不是JSON对象。它是一个普通的JavaScript对象。 阅读数据:选项: 要发送到服务器的数据。它被转换为查询字符串(如果还不是字符串的话)。

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

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

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


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

return "\"received markers\"";

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

我也遇到过这种情况,这就是我的解。

如果你在解析数据时遇到了一个无效的json对象异常,即使你知道你的json字符串是正确的,在解析到json之前,将你在ajax代码中接收到的数据进行stringify:

$.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 ...

你提到使用json2.js来stringify你的数据,但是post的数据似乎是URLEncoded JSON,你可能已经见过了,但是这篇关于无效JSON原语的文章涵盖了为什么JSON是URLEncoded。

我建议不要将原始的、手动序列化的JSON字符串传递到您的方法中。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就不会尝试对数据进行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)非常灵活,可以将输入数据转换为您指定的服务器端类型。

请按此使用ajax调用java的webservice Var参数= { feildName: feildValue }; JSON。Stringify ({data: param})

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