csdnceshi58
Didn"t forge
采纳率25%
2011-06-12 17:14

Ajax Posting json 到 webservice

已采纳

I am trying to post a JSON object to a asp.net webservice.

My json looks like this:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

I am using the json2.js to stringyfy my json object.

and i am using jquery to post it to my 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);
        }
  });

I am getting the following error:

"Invalid JSON primitive:

I have found a bunch of posts relating to this and it seems to be a really common problem but nothing i try fixes the issue.

When firebug what is being posted to the server it looks like this:

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

My webservice function that is being called is:

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

转载于:https://stackoverflow.com/questions/6323338/jquery-ajax-posting-json-to-webservice

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • csdnceshi73 喵-见缝插针 10年前

    You mentioned using json2.js to stringify your data, but the POSTed data appears to be URLEncoded JSON You may have already seen it, but this post about the invalid JSON primitive covers why the JSON is being URLEncoded.

    I'd advise against passing a raw, manually-serialized JSON string into your method. ASP.NET is going to automatically JSON deserialize the request's POST data, so if you're manually serializing and sending a JSON string to ASP.NET, you'll actually end up having to JSON serialize your JSON serialized string.

    I'd suggest something more along these lines:

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

    The key to avoiding the invalid JSON primitive issue is to pass jQuery a JSON string for the data parameter, not a JavaScript object, so that jQuery doesn't attempt to URLEncode your data.

    On the server-side, match your method's input parameters to the shape of the data you're passing in:

    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.";
    }
    

    You can also accept an array, like Marker[] Markers, if you prefer. The deserializer that ASMX ScriptServices uses (JavaScriptSerializer) is pretty flexible, and will do what it can to convert your input data into the server-side type you specify.

    点赞 22 评论 复制链接分享
  • csdnceshi80 胖鸭 10年前
    1. markers is not a JSON object. It is a normal JavaScript object.
    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.

    If you want to send the data as JSON, you have to encode it first:

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

    jQuery does not convert objects or arrays to JSON automatically.


    But I assume the error message comes from interpreting the response of the service. The text you send back is not JSON. JSON strings have to be enclosed in double quotes. So you'd have to do:

    return "\"received markers\"";
    

    I'm not sure if your actual problem is sending or receiving the data.

    点赞 8 评论 复制链接分享
  • csdnceshi58 Didn"t forge 9年前

    I have encountered this one too and this is my solution.

    If you are encountering an invalid json object exception when parsing data, even though you know that your json string is correct, stringify the data you received in your ajax code before parsing it to 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 ...
    
    点赞 6 评论 复制链接分享
  • csdnceshi75 衫裤跑路 3年前

    I have query,

    $("#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);
                }
            });
    
        });
    

    I'm posting the the login details in json and getting a string as "Success",but I'm not getting the response.

    点赞 5 评论 复制链接分享
  • csdnceshi67 bug^君 8年前

    I tried Dave Ward's solution. The data part was not being sent from the browser in the payload part of the post request as the contentType is set to "application/json". Once I removed this line everything worked great.

    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);
        }
    });
    
    点赞 2 评论 复制链接分享
  • csdnceshi54 hurriedly% 5年前

    Please follow this to by ajax call to webservice of java var param = { 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);
                }
            });
    
    点赞 评论 复制链接分享

相关推荐