Jquery Ajax Webservice'e json gönderme

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

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

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

Json nesnemi stringyfy etmek için json2.js kullanıyorum.

ve bunu web servisime 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 ilkeli:

Bununla ilgili bir sürü gönderi buldum ve gerçekten yaygın bir sorun gibi görünüyor, ancak denediğim hiçbir şey sorunu çözmüyor.

Firebug sunucuya ne gönderildiğini kontrol ettiğinde aşağıdaki gibi görünür:

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

Çağrılan webservis fonksiyonum şu şekildedir:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
Çözüm

Verilerinizi dizeleştirmek için json2.js kullandığınızdan bahsetmişsiniz, ancak POST edilen veriler URLEncoded JSON olarak görünüyor Daha önce görmüş olabilirsiniz, ancak geçersiz JSON ilkeli hakkındaki bu yazı JSON'un neden URLEncoded olduğunu açıklamaktadır.

Yönteminize ham, manuel olarak serileştirilmiş bir JSON dizesi geçirmenizi *tavsiye ederim]2. ASP.NET, POST verilerini otomatik olarak JSON serileştirme işlemine tabi tutacaktır, bu nedenle ASP.NET'e bir JSON dizesini elle serileştirip gönderiyorsanız, aslında JSON serileştirilmiş dizenizi JSON serileştirmek zorunda kalacaksınız.

Ben daha çok bu çizgide bir şey öneriyorum:

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 sorunundan kaçınmanın anahtarı, jQuery'ye data parametresi için bir JavaScript nesnesi değil, bir JSON dizesi iletmektir, böylece jQuery verilerinizi URLEncode etmeye çalışmaz.

Sunucu tarafında, yönteminizin girdi 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 Markers)
{
  return "Received " + Markers.Count + " markers.";
}

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

Yorumlar (13)
  1. markers` bir JSON nesnesi değildir. Normal bir JavaScript nesnesidir.
  2. data:` seçeneği hakkında bilgi edinin:

    Sunucuya gönderilecek veri. 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ın yorumlanmasından kaynaklandığını varsayıyorum. Geri gönderdiğiniz metin JSON değil. JSON dizeleri çift tırnak içine alınmalıdır. Yani yapmanız gereken:

return "\"received markers\"";

Asıl sorununuzun veri göndermek mi yoksa almak mı olduğundan emin değilim.

Yorumlar (9)

Bununla ben de karşılaştım ve çözümüm bu.

Json dizenizin doğru olduğunu bilmenize rağmen verileri ayrıştırırken geçersiz bir json nesnesi istisnasıyla karşılaşıyorsanız, ajax kodunuzda aldığınız verileri JSON'a ayrıştırmadan önce dizeleştirin:

$.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 ...
Yorumlar (0)