Jquery Ajax Đăng json lên webservice


238

Tôi đang cố gắng đăng một đối tượng JSON lên một dịch vụ web asp.net.

Json của tôi trông như thế này:

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

Tôi đang sử dụng json2.js để xâu chuỗi đối tượng json của tôi.

và tôi đang sử dụng jquery để đăng nó lên dịch vụ web của mình.

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

Tôi nhận được lỗi sau:

"Nguyên thủy JSON không hợp lệ:

Tôi đã tìm thấy một loạt các bài viết liên quan đến vấn đề này và nó dường như là một vấn đề thực sự phổ biến nhưng không có gì tôi cố gắng khắc phục vấn đề.

Khi fireorms những gì đang được đăng lên máy chủ, nó trông như thế này:

đánh dấu% 5% 0% 5% 5% 5D = 42.5978231292517 & điểm đánh dấu% 5B2% 5D% 5BmarkerPocation% 5D = -3

Chức năng dịch vụ web của tôi đang được gọi là:

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

'thất bại' không được cung cấp như một cài đặt có thể có trong số những cài đặt được liệt kê trong api.jquery.com/jQuery.ajax ... có thể bạn đã nhầm nó với 'lỗi'?
danicotra

Câu trả lời:


390

Bạn đã đề cập bằng cách sử dụng json2.js để xâu chuỗi dữ liệu của mình, nhưng dữ liệu đã đăng có vẻ là URLEncoding JSON Bạn có thể đã thấy nó, nhưng bài đăng này về nguyên thủy JSON không hợp lệ bao gồm lý do JSON bị URLEncoding.

Tôi muốn tư vấn cho chống lại đi qua một liệu, thủ công-đăng chuỗi JSON vào phương pháp của bạn . ASP.NET sẽ tự động khử tuần tự hóa dữ liệu POST của yêu cầu, vì vậy nếu bạn tự xâu chuỗi và gửi một chuỗi JSON đến ASP.NET, cuối cùng bạn sẽ phải thực hiện tuần tự hóa chuỗi JSON của mình.

Tôi muốn đề xuất một cái gì đó dọc theo những dòng này:

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

Chìa khóa để tránh vấn đề nguyên thủy JSON không hợp lệ là truyền cho jQuery một chuỗi JSON cho datatham số, không phải đối tượng JavaScript, để jQuery không cố gắng URLEncode dữ liệu của bạn.

Về phía máy chủ, khớp các tham số đầu vào của phương thức của bạn với hình dạng của dữ liệu bạn truyền vào:

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

Bạn cũng có thể chấp nhận một mảng, như Marker[] Markers, nếu bạn thích. Trình giải nén mà ASMX ScriptService sử dụng (JavaScriptSerializer) khá linh hoạt và sẽ làm những gì có thể để chuyển đổi dữ liệu đầu vào của bạn thành loại phía máy chủ mà bạn chỉ định.


4
Bạn đã viết "để jQuery không cố gắng URLEncode dữ liệu của bạn.", Nhưng nó không đúng. Để ngăn chặn jquery từ urlencoding dữ liệu của bạn, bạn phải đặt processData thành false.
Softlion

8
Truyền vào một chuỗi là đủ để ngăn jQuery khỏi URLEncoding tham số dữ liệu. Bạn có thể đặt processData thành false, nhưng nó không cần thiết (và làm điều đó một mình, mà không truyền chuỗi JSON cho dữ liệu, là không đủ).
Dave Ward

1
Vấn đề tương tự (và câu trả lời) này cũng áp dụng cho Rails.
GregT

2
@DaveWard Được contentTypexem xét nếu chúng ta sử dụng GET và không POST?
Royi Namir

@RoyiNamir Nếu bạn đang sử dụng ASMX ScriptService hoặc ASPX WebMethods, bạn cần sử dụng POST để khiến họ trả về JSON. Nếu bạn NHẬN, Kiểu nội dung có chính xác hay không, thay vào đó, bạn sẽ nhận được XML.
Dave Ward

18
  1. markerskhông phải là một đối tượng JSON. Nó là một đối tượng JavaScript bình thường.
  2. Đọc về data:tùy chọn :

    Dữ liệu được gửi đến máy chủ. Nó được chuyển đổi thành một chuỗi truy vấn , nếu chưa phải là một chuỗi.

Nếu bạn muốn gửi dữ liệu dưới dạng JSON, trước tiên bạn phải mã hóa nó:

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

jQuery không tự động chuyển đổi các đối tượng hoặc mảng thành JSON.


Nhưng tôi cho rằng thông báo lỗi xuất phát từ việc diễn giải phản hồi của dịch vụ. Văn bản bạn gửi lại không phải là JSON. Các chuỗi JSON phải được đặt trong dấu ngoặc kép. Vì vậy, bạn phải làm:

return "\"received markers\"";

Tôi không chắc vấn đề thực sự của bạn là gửi hay nhận dữ liệu.


Cảm ơn bạn đã giúp đỡ Felix, tôi nghĩ rằng bằng cách chạy các điểm đánh dấu thông qua phương thức JSON.opesyfy tôi đã chuyển đổi nó thành một chuỗi truy vấn, tôi đã làm như bạn đề xuất nhưng thật không may là tôi không đăng bài sau.
Mã Pharaoh

markers =% 7B% 22markers% 22% 3A% 5B% 7B% 22 %% 22% 3A% 22128.3657142857143% 22% 2C% 22markerPocation% 22% 3A% 227% 22% 7D% 2C% 7B% 22 %% 22% % 22% 2C% 22marker Vị trí% 22% 3A% 2219% 22% 7D% 2C% 7B% 22 %% 22% 3A% 2242.5978231292517% 22% 2C% 22markerPocation% 22% 3A% 22-3% 22% 7D% 5D
Mã Pharaoh

@Dreamguts: Có một chút không rõ ràng với tôi những gì bạn muốn. Bạn có muốn gửi markersdưới dạng chuỗi JSON không?
Felix Kling

Xin chào Felix, vâng tôi muốn gửi đối tượng đánh dấu dưới dạng chuỗi JSON để tôi có thể sử dụng nó trong dịch vụ web của mình.
Mã Pharaoh

@Dreamguts: Sau đó, nó nên hoạt động theo cách này. Ngoài ra "mã" bạn đã đăng trong bình luận có vẻ ổn. Tất nhiên bạn phải giải mã nó đúng cách ở phía máy chủ và có lẽ bạn phải thay đổi tên của tham số, tôi không biết.
Felix Kling

3

Tôi đã thử giải pháp của Dave Ward. Phần dữ liệu không được gửi từ trình duyệt trong phần tải trọng của yêu cầu bài đăng khi contentType được đặt thành "application/json". Một khi tôi loại bỏ dòng này mọi thứ hoạt động tuyệt vời.

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

Tôi cũng đã gặp cái này và đây là giải pháp của tôi.

Nếu bạn gặp phải ngoại lệ đối tượng json không hợp lệ khi phân tích dữ liệu, mặc dù bạn biết rằng chuỗi json của mình là chính xác, hãy xâu chuỗi dữ liệu bạn nhận được trong mã ajax trước khi phân tích cú pháp thành 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 ...

1

Tôi có câu hỏi

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

    });

Tôi đang đăng các chi tiết đăng nhập trong json và nhận được một chuỗi "Success", nhưng tôi không nhận được phản hồi.


1
Đây không phải là câu trả lời cho câu hỏi. Nếu bạn muốn đặt câu hỏi thì hãy vào menu "Câu hỏi" và nhấp vào "Đặt câu hỏi" và nếu câu hỏi của bạn có liên quan đến câu hỏi này thì hãy cung cấp liên kết tham khảo trong câu hỏi của bạn.
Găng tay Patal

-2

Vui lòng làm theo điều này bằng cách gọi ajax đến dịch vụ web của java var param = {feildName: feildValue}; JSON.opesify ({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);
            }
        });

Dưới đây là cách liệt kê đối tượng truyền vào json cho lệnh gọi ajax của dịch vụ web java.
Ravi Panchal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.