Jquery Ajax json'u web servisine gönderme


238

Bir asp.net web hizmetine bir JSON nesnesi göndermeye çalışıyorum.

Benim json şöyle görünüyor:

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

Benim json nesnesini stringyfy json2.js kullanıyorum.

ve ben webservice göndermek için jquery kullanıyorum.

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

Aşağıdaki hatayı alıyorum:

"Geçersiz JSON ilkel:

Bununla ilgili mesajlar bir demet buldum ve gerçekten yaygın bir sorun gibi görünüyor ama denediğim hiçbir şey sorunu çözüyor.

Firebug sunucuya ne yayınlanır gibi görünüyor:

markörler% 5B0% 5D% 5Bposition% 5D = 128,3657142857143 ve işaretleri% 5B0% 5D% 5BmarkerPosition% 5D = 7 ve işaretleri% 5B1% 5D% 5Bposition% 5D = 235,1944023323615 ve işaretleri% 5B1% 5D% 5BmarkerPosition% 5D = 19 ve işaretleri% 5b2% 5D% 5Bposition% 5D = 42,5978231292517 ve işaretleri% 5b2% 5D% 5BmarkerPosition% 5D = -3

Web hizmeti işlevi çağrılıyor:

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

'başarısızlık' api.jquery.com/jQuery.ajax'da listelenenler arasında olası bir ayar olarak sağlanmamıştır ... belki de bunun yerine 'hata' ile hata yaptınız?
danicotra

Yanıtlar:


390

Verilerinizi dizgi yapmak için json2.js kullandığınızdan bahsettiniz, ancak POSTed verileri URLEncoded JSON gibi görünüyor Bunu zaten görmüş olabilirsiniz, ancak JSON ilkeliyle ilgili bu yazı JSON'un neden URLEncoded edildiğini kapsar.

Ben istiyorum tavsiyelerde karşı senin yöntem haline ham el-tefrika JSON dizesi geçirerek . ASP.NET otomatik olarak JSON isteğin POST verilerinin serisini kaldırır, bu nedenle ASP.NET'e bir JSON dizesini el ile serileştirir ve gönderiyorsanız, aslında JSON serileştirilmiş dizenizi JSON serileştirmeniz gerekir.

Bu çizgiler boyunca daha fazla bir şey öneririm:

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

Geçersiz JSON ilkel sorununu önlemenin anahtarı jQuery dataparametresi için bir JavaScript nesnesi değil, bir JSON dizesi iletmektir, böylece jQuery verilerinizi URLEncode etmeye çalışmaz.

Sunucu tarafında, yönteminizin giriş parametrelerini ilettiğiniz verilerin şekliyle eşleştirin:

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

İsterseniz bir diziyi de kabul edebilirsiniz Marker[] Markers. ASMX ScriptServices'in kullandığı serileştirici (JavaScriptSerializer) oldukça esnektir ve giriş verilerinizi belirttiğiniz sunucu tarafı türüne dönüştürmek için elinden geleni yapacaktır.


4
"Böylece jQuery verilerinizi URLEncode etmeye çalışmaz" yazdınız, ancak bu doğru değil. Jquery'nin verilerinizi kodlamasını engellemek için processData öğesini false olarak ayarlamanız gerekir.
Softlion

8
Bir dize iletmek, jQuery'nin data parametresini URLE kodlamasını önlemek için yeterlidir. ProcessData öğesini false olarak ayarlayabilirsiniz, ancak gereksizdir (ve bunu veri için bir JSON dizesi iletmeden tek başına yapmak yeterli değildir).
Dave Ward

1
Aynı sorun (ve cevap) Rails için de geçerlidir.
GregT

2
@DaveWard contentTypePOST yerine GET kullanırsak dikkate alınır mı ?
Royi Namir

@RoyiNamir ASMX ScriptServices veya ASPX WebMethods kullanıyorsanız, JSON'u döndürmelerini sağlamak için POST kullanmanız gerekir. GET, Content-Type doğru olsun veya olmasın, bunun yerine XML alırsınız.
Dave Ward

19
  1. markersbir JSON nesnesi değil. Bu normal bir JavaScript nesnesidir.
  2. Hakkında okuyun data:Seçenek :

    Sunucuya gönderilecek veriler. Zaten bir dize değilse, bir sorgu dizesine dönüştürülür .

Verileri JSON olarak göndermek istiyorsanız, önce kodlamanız gerekir:

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

jQuery, nesneleri veya dizileri otomatik olarak JSON'a dönüştürmez.


Ancak hata mesajının hizmetin yanıtını yorumlamaktan geldiğini varsayıyorum. Geri gönderdiğiniz metin JSON değil. JSON dizeleri çift tırnak içine alınmalıdır. Yani yapmanız gerekenler:

return "\"received markers\"";

Asıl sorununuzun veri gönderip göndermediğinden emin değilim.


Felix yardım için teşekkürler, ben JSON.stringyfy yöntemi ile bir sorgu dizesine dönüştürmek işaretçileri çalıştırarak, ben önerdiğim gibi yaptım ama ne yazık ki işe yaramazsa aşağıdaki gönderme değil düşündüm.
Firavun

markörler =% 7B% 22markers% 22% 3A% 5B% 7B% 22position% 22% 3A% 22.128,3657142857143% 22% 2C% 22markerPosition% 22% 3A% 227,% 22,% 7D% 2C% 7B% 22position% 22% 3A% 22.235,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
Firavun

@Dreamguts: Bana ne istediğini biraz belirsiz. markersJSON dizesi olarak göndermek istiyor musunuz ?
Felix Kling

Merhaba Felix, evet i webservice kullanabilirsiniz böylece bir JSON dize olarak işaretleyicileri nesne göndermek istiyorum.
Kod Firavun

@Dreamguts: O zaman bu şekilde çalışmalı. Ayrıca yorumda yayınlanan "kod" Tamam görünüyor. Tabii ki sunucu tarafında düzgün bir şekilde kodunu çözmeniz gerekiyor ve belki parametrenin adını değiştirmeniz gerekiyor, bilmiyorum.
Felix Kling

3

Dave Ward'ın çözümünü denedim. ContentType olarak ayarlandığı için, veri bölümü, gönderi isteğinin yük bölümünde tarayıcıdan gönderilmiyordu "application/json". Bu çizgiyi kaldırdığımda her şey harika çalıştı.

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

Ben de bununla karşılaştım ve bu benim çözümüm.

Verileri ayrıştırırken geçersiz bir json nesnesi istisnasıyla karşılaşıyorsanız, json dizenizin doğru olduğunu biliyor olsanız bile, ajax kodunuzda aldığınız verileri JSON'a ayrıştırmadan önce dize edin:

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

Sorgum var,

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

    });

Giriş bilgilerini json'da gönderiyorum ve bir dize alıyorum "Success", ancak yanıtı almıyorum.


1
Bu sorunun cevabı değil. Soruyu sormak istiyorsanız, "Soru" menüsüne gidin ve "Soru Sor" u tıklayın ve sorunuz bu soru ile ilgiliyse, sorunuzdaki referans bağlantısını sağlayın.
Mittal Patel

-2

Lütfen bunu 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);
            }
        });

burada nasıl json java webservice ajax çağrısı geçmek nesne listelemek için.
Ravi Panchal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.