ajax isteği için jQuery "ayrıştırıcı" döndürüyor


186

Bir Ajax isteği için jquery bir "ayrıştırıcı" alıyorum, ben POST bir GET, birkaç farklı yollarla (sınıf oluşturma, vb) veri döndürerek değiştirmeye çalıştım ama sorunun ne olduğunu anlayamıyorum gibi görünüyor.

Projem MVC3 ve ben jQuery 1.5 kullanıyorum Bir açılan var ve onchange olayı seçilen ne dayalı bazı veri almak için bir çağrı ateş.

Açılır menü: (bu, Görünüm Çantası'ndaki listeden "Görünümler" i yükler ve etkinliğin tetiklenmesi iyi çalışır)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

JavaScript:

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

Yukarıdaki kod başarıyla MVC yöntemini çağırır ve döndürür:

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

Ancak jquery, $ .ajax () yöntemi için "parsererror" yazan hata olayını başlatır.


konsolda bir javascript hatası veriyor mu veya $ .ajax () komutunun "error" işleyici işlevi yürütülüyor mu?
arnorhs

üzgünüm, daha spesifik olmalıydı, $ .ajax () hata fonksiyonu {alert ("Error"); }
dkarzon

Canlı bağlantı şansı var mı? Firebug'da gösterdiğiniz JSON verilerini görüyor musunuz?
Pekka

Hayır, canlı bir bağlantım yok. Ama evet bu Firebug'da gösterilen JSON yanıtı.
dkarzon

evet, kötüm bir yazım hatasıydı. Soru düzeltildi
dkarzon

Yanıtlar:


307

Geçenlerde bu sorunla karşılaştım ve bu soru üzerine tökezledim.

Çok daha kolay bir şekilde çözdüm.

Birinci Yöntem

dataType: 'json'Özelliği nesne değişmezinden kaldırabilirsiniz ...

İkinci Yöntem

Veya verilerinizi olarak geri göndererek @Sagiv'in söylediklerini yapabilirsiniz Json.


Bu parsererroriletinin oluşmasının nedeni , yalnızca bir dize veya başka bir değer döndürdüğünüzde, gerçekte olmamasıdır Json, bu nedenle ayrıştırıcı ayrıştırılırken başarısız olur.

Bu nedenle dataType: jsonözelliği kaldırırsanız, ayrıştırmaya çalışmaz Json.

Diğer yöntemle, verilerinizi şu şekilde döndürdüğünüzden emin olursanız Json, ayrıştırıcı verilerin düzgün bir şekilde nasıl işleneceğini bilecektir.


4
Teşekkürler David, Method One benim için çalıştı. Benim durumumda bir şey iade değildi ama yanlışlıkla bir veri türü kullanılır. Bahşiş için teşekkürler.
Krishna Teja Veeramachaneni

Yanıtınız için teşekkürler, daha iyi bir çözüm gibi göründüğü için görevin cevabını güncelledim.
dkarzon

Benim php komut dosyası bir hata vardı ve JSON olmayan veri - dataType gerçekten devre dışı bırakmak için yararlı bir öneri döndürürken bu sorunla karşılaştı !
Sharadh

Teşekkür ederim! Bu, JQuery AJAX yöntemlerini kullanan jquery.fileupload.js ve diğer kütüphaneler için de geçerlidir. Kafa karıştırıcı hata mesajı!
kqr

Rails jquery-ujs kullanarak bu sorunu alıyorum
Donato

29

Sorunu çözmenin doğru yolu için @ david-east yanıtına bakın

Bu yanıt yalnızca file: protokolünü kullanırken jQuery 1.5 ile ilgili bir hatayla ilgilidir .

Son zamanlarda jQuery 1.5'e yükseltme yaparken benzer bir sorun vardı. Doğru yanıt almasına rağmen hata işleyici harekete geçti. completeOlayı kullanarak ve sonra durum değerini kontrol ederek çözdüm. Örneğin:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

1
Onaylandı JQuery
1.5.1'de

13
1.7.2 :(
Eystein Bye

6
Sadece bu problemi yaşıyordum, ama veri tipini kaldırdım: 'json' ve problem çözüldü. Gerçek bir form json döndürmediği için bir ayrıştırıcı hatasıyla karşılaşır.
David East

3
1.9.1 Bu sorunu yaşıyorum ve benim API boş bir karma döndürerek etrafında aldım {}. Yazık bu gerekli.
Adam Tuttle

4
Bu aslında belgelerde: ...The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. api.jquery.com/jQuery.ajax
Rob

17

Sen ajax çağrı yanıtı belirttiğiniz dataType olarak:

'Json'

burada gerçek ajax yanıtı geçerli bir JSON olmadığından ve sonuç olarak JSON ayrıştırıcısı bir hata atıyor.

Tavsiye ederim en iyi yaklaşım dataType değiştirmek için:

'Metin'

ve başarılı geri arama içinde, geçerli bir JSON'un döndürülüp döndürülmediğini doğrular ve JSON doğrulaması başarısız olursa, ekranda ajax çağrısının gerçekte başarısız olması için onu uyarır. Şuna bir göz atın:

$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    dataType: 'text',
    data: {viewID: $("#view").val()},
    success: function (data) {
        try {
            var output = JSON.parse(data);
            alert(output);
        } catch (e) {
            alert("Output is not valid JSON: " + data);
        }
    }, error: function (request, error) {
        alert("AJAX Call Error: " + error);
    }
});

1
veya veri türünü kaldırın :)
Alexander

10

sorun, denetleyicinizin dize veya ayrıştırılamayan başka bir nesneyi döndürmesidir. ajax çağrısının Json'u alması bekleniyor. JsonResult'u denetleyicide şu şekilde döndürmeye çalışın:

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

Umarım yardımcı olur :)


Üzgünüm, benim kod arkamı eklemeyi unuttum, ama tam olarak Json nasıl iade edilir.
dkarzon


4

Kaldırılacak çok sayıda öneri var

dataType: "json"

Bunun işe yaradığını kabul ederken, altta yatan sorunu görmezden geliyor. Dönüş dizesinin gerçekten JSON olduğundan eminseniz, yanıtın başlangıcında hatalı boşluk olup olmadığına bakın. Kemancıya bakmayı düşünün. Benimki şöyle görünüyordu:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

Benim durumumda bu PHP istenmeyen karakterleri (bu durumda UTF dosyası Malzeme Listesi) püsküren bir sorun vardı. Bunları kaldırdığımda, aynı zamanda

dataType: json

Buna katılıyorum ... Ben yanıtı kontrol ve app bir yerde kayboldu var_dump () oldu.
Chuck

2

Hata ayıklama kodunu veya istenmeyen bilgiler çıkarabilecek herhangi bir şeyi kaldırdığınızdan emin olun. Biraz açık, ama şu an unutulması kolay.


0

Bu hala geçerli olup olmadığını bilmiyorum ama Kodlama ile ilgili sorun oldu. ANSI'ye geçmek sorunu çözdü.


0

IE'de HTTP GET kullanarak bu sorunu alırsanız önbellek: false ayarlayarak bu sorunu çözdü. Hem HTML hem de json istekleri için aynı url'yi kullandığım için json çağrısı yapmak yerine önbelleğe çarptı.

$.ajax({
    url: '/Test/Something/',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
});

0

dataType: "json" öğesini kaldırmalısınız. Sonra sihri bakın ... böyle bir şey yapmanın nedeni, json nesnesini basit dizeye dönüştürmektir.

this.LoadViewContentNames = function () {
$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
 });
};

0

web .net mvc / api'den işlem alma durumunda, izin verdiğinizden emin olun

     return Json(data,JsonRequestBehavior.AllowGet);

0

Ayrıca "Hata ile dönüş iste: ayrıştırıcı" alıyordum. javascript konsolunda. Benim durumumda bu Json meselesi değildi, ama görünüm metin alanına geçerli bir kodlama geçmek zorunda kaldı.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);

0

Böyle bir hatayla karşılaştım, ancak istemciye göndermeden önce yanıtımı değiştirdikten sonra iyi çalıştı.

//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response);  // Sending to client

//Client side
success: function(res, status) {
    response = JSON.parse(res); // Getting as expected
    //Do something
}

0

Aynı problemim vardı, web.configtakım arkadaşlarımla aynı değildi. Lütfen kontrol edin web.config.

Umarım bu birine yardımcı olur.


-1

Sorun

window.JSON.parse $ .parseJSON işlevinde bir hata oluşturur.

<pre>
$.parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
</pre>

Çözümüm

Requirjs aracını kullanarak JQuery aşırı yükleme .

<pre>
define(['jquery', 'jquery.overload'], function() { 
    //Loading jquery.overload
});
</pre>

jquery.overload.js dosya içeriği

<pre>
define(['jquery'],function ($) { 

    $.parseJSON: function( data ) {
        // Attempt to parse using the native JSON parser first
        /**  THIS RAISES Parsing ERROR
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }
        **/

        if ( data === null ) {
            return data;
        }

        if ( typeof data === "string" ) {

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim( data );

            if ( data ) {
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                    .replace( rvalidtokens, "]" )
                    .replace( rvalidbraces, "")) ) {

                    return ( new Function( "return " + data ) )();
                }
            }
        }

        $.error( "Invalid JSON: " + data );
    }

    return $;

});
</pre>

-1

Kaldırmak / değiştirmek istemiyorsanızdataType: json , bir özel tanımlayarak jQuery'nin katı ayrıştırmasını geçersiz kılabilirsiniz converter:

$.ajax({
    // We're expecting a JSON response...
    dataType: 'json',

    // ...but we need to override jQuery's strict JSON parsing
    converters: {
        'text json': function(result) {
            try {
                // First try to use native browser parsing
                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
                    return JSON.parse(result);
                } else {
                    // Fallback to jQuery's parser
                    return $.parseJSON(result);
                }
            } catch (e) {
               // Whatever you want as your alternative behavior, goes here.
               // In this example, we send a warning to the console and return 
               // an empty JS object.
               console.log("Warning: Could not parse expected JSON response.");
               return {};
            }
        }
    },

    ...

Bunu kullanarak, yanıt JSON olarak ayrıştırılamadığında davranışı özelleştirebilirsiniz (boş bir yanıt gövdesi alsanız bile!)

Bu özel dönüştürücü ile, istek başka şekilde başarılı olduğu sürece .done()/ successtetiklenir (1xx veya 2xx yanıt kodu).

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.