jQuery mengembalikan "parsererror" untuk permintaan ajax

186

Sudah mendapatkan "parsererror" dari jquery untuk permintaan Ajax, saya telah mencoba mengubah POST menjadi GET, mengembalikan data dalam beberapa cara berbeda (membuat kelas, dll.) Tetapi saya tidak bisa mencari tahu apa masalahnya.

Proyek saya ada di MVC3 dan saya menggunakan jQuery 1.5 Saya memiliki Dropdown dan pada acara pertukaran saya melakukan panggilan untuk mendapatkan beberapa data berdasarkan apa yang dipilih.

Dropdown: (ini memuat "Tampilan" dari daftar di Viewbag dan menjalankan acara dengan baik)

@{
    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");
        }
    });
};

Kode di atas berhasil memanggil metode MVC dan mengembalikan:

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

Tapi jquery menjalankan event error untuk metode $ .ajax () yang mengatakan "parsererror".

dakarzon
sumber
apakah itu memunculkan kesalahan javascript di konsol atau apakah fungsi handler "error" dari perintah $ .ajax () dijalankan?
arnorhs
maaf, seharusnya lebih spesifik, ini mengaktifkan fungsi galat $ .ajax () {alert ("Error"); }
dkarzon
Adakah peluang tautan langsung? Apakah Anda melihat data JSON yang Anda perlihatkan di Firebug?
Pekka
Tidak, saya tidak punya tautan langsung. Tapi ya itu respons JSON yang ditunjukkan di Firebug.
dkarzon
ya, kesalahanku itu salah ketik. Memperbaiki pertanyaan
dkarzon

Jawaban:

306

Saya baru-baru ini mengalami masalah ini dan menemukan pertanyaan ini.

Saya mengatasinya dengan cara yang jauh lebih mudah.

Metode Satu

Anda dapat menghapus dataType: 'json'properti dari objek literal ...

Metode Dua

Atau Anda dapat melakukan apa yang dikatakan @Sagiv dengan mengembalikan data Anda sebagai Json.


Alasan mengapa parsererrorpesan ini terjadi adalah ketika Anda hanya mengembalikan string atau nilai lain, itu tidak benar-benar Json, sehingga parser gagal saat menguraikannya.

Jadi, jika Anda menghapus dataType: jsonproperti, itu tidak akan mencoba menguraikannya sebagai Json.

Dengan metode lain jika Anda memastikan untuk mengembalikan data Anda Json, parser akan tahu cara menanganinya dengan benar.

David East
sumber
4
Terima kasih David, Metode Satu bekerja untuk saya. Dalam kasus saya, saya tidak mengembalikan apa pun kecuali menggunakan tipe data secara tidak sengaja. Terima kasih atas tipnya.
Krishna Teja Veeramachaneni
Terima kasih atas jawabannya, saya telah memperbarui jawaban untuk pencarian karena ini sepertinya solusi yang lebih baik.
dkarzon
Saya mengalami masalah ini ketika skrip php saya mengalami kesalahan, dan mengembalikan data non-JSON - saran yang berguna untuk menonaktifkan dataType memang!
Sharadh
Terima kasih! Ini berlaku juga untuk jquery.fileupload.js dan pustaka lainnya menggunakan metode JQuery AJAX. Pesan kesalahan yang membingungkan!
kqr
Saya mendapatkan masalah ini menggunakan Rails jquery-ujs
Donato
29

Lihat jawabannya oleh @ david-east untuk cara yang benar dalam menangani masalah ini

Jawaban ini hanya relevan untuk bug dengan jQuery 1.5 saat menggunakan file: protokol.

Saya memiliki masalah yang sama baru-baru ini ketika meningkatkan ke jQuery 1.5. Meskipun mendapatkan respons yang benar, penangan kesalahan menembak. Saya mengatasinya dengan menggunakan completeacara dan kemudian memeriksa nilai status. misalnya:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
Johnhunter
sumber
1
Dikonfirmasi diperbaiki di JQuery 1.5.1
johnhunter
13
Saya memiliki masalah ini di 1.7.2 :(
Eystein Bye
6
Saya baru saja mengalami masalah ini, tetapi saya menghapus datatype: 'json' dan masalahnya selesai. Karena tidak mengembalikan bentuk json yang benar maka ia akan mengalami kesalahan parser.
David East
3
Saya mengalami masalah ini di 1.9.1, dan saya menyelesaikannya dengan meminta API mengembalikan hash kosong {}. Malu ini perlu.
Adam Tuttle
4
Ini sebenarnya dalam dokumentasi: ...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

Anda telah ditentukan respon panggilan ajax dataType sebagai:

'json'

dimana sebagai respons ajax sebenarnya bukan JSON yang valid dan sebagai hasilnya parser JSON melempar kesalahan.

Pendekatan terbaik yang saya sarankan adalah untuk mengubah dataType ke:

'teks'

dan di dalam keberhasilan panggilan balik memvalidasi apakah JSON yang valid sedang dikembalikan atau tidak, dan jika validasi JSON gagal, beri tahu di layar sehingga jelas untuk tujuan apa panggilan ajax sebenarnya gagal. Lihatlah ini:

$.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);
    }
});
Nadeem Khan
sumber
1
atau hapus datatype :)
Alexander
10

masalahnya adalah controller Anda mengembalikan string atau objek lain yang tidak dapat diuraikan. panggilan ajax diharapkan untuk mendapatkan Json sebagai imbalan. coba kembalikan JsonResult di controller seperti itu:

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

    }

semoga membantu :)

Sagiv Ofek
sumber
Maaf, lupa untuk memasukkan codebehind saya, tapi itu persis bagaimana Json dikembalikan.
dkarzon
4

Ada banyak saran untuk dihapus

dataType: "json"

Meskipun saya akui bahwa ini berfungsi, namun mengabaikan masalah mendasar. Jika Anda yakin string kembali benar-benar JSON, maka cari spasi kosong di awal respons. Pertimbangkan untuk melihatnya di fiddler. Milik saya terlihat seperti ini:

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

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

Dalam kasus saya ini adalah masalah dengan PHP memuntahkan karakter yang tidak diinginkan (dalam hal ini file BOM UTF). Setelah saya menghapus ini itu memperbaiki masalah sambil juga menjaga

dataType: json
Sam Strachan
sumber
Setuju dengan ini ... Saya memeriksa respons dan itu adalah var_dump () yang hilang di suatu tempat di aplikasi.
Chuck
2

Pastikan Anda menghapus kode debug apa pun atau apa pun yang mungkin menghasilkan informasi yang tidak diinginkan. Agak jelas, tetapi mudah dilupakan saat ini.

Jahmic
sumber
0

Saya tidak tahu apakah ini masih aktual tetapi ada masalah dengan Encoding. Mengubah ke ANSI menyelesaikan masalah untuk saya.

George Dgebuadze
sumber
0

Jika Anda mendapatkan masalah ini menggunakan HTTP GET di IE saya memecahkan masalah ini dengan mengatur cache: false. Karena saya menggunakan url yang sama untuk permintaan HTML dan json, ia menekan cache alih-alih melakukan panggilan json.

$.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");
    }
});
Stuart
sumber
0

Anda harus menghapus dataType: "json". Kemudian lihat keajaiban ... alasan melakukan hal seperti itu adalah bahwa Anda mengubah objek json menjadi string sederhana .. jadi json parser tidak dapat mengurai string itu karena tidak menjadi objek json.

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");
    }
 });
};
Anak laki-laki Desi
sumber
0

Memetikan Dapatkan operasi dari web .net mvc / api, pastikan Anda diizinkan

     return Json(data,JsonRequestBehavior.AllowGet);
Mohamed.Abdo
sumber
0

Saya juga mendapatkan "Minta pengembalian dengan kesalahan: parsererror." di konsol javascript. Dalam kasus saya itu bukan masalah Json, tapi saya harus beralih ke area teks tampilan pengkodean yang valid.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);
Laura Liparulo
sumber
0

Saya telah mengalami kesalahan seperti itu tetapi setelah memodifikasi respons saya sebelum mengirimnya ke klien itu berfungsi dengan baik.

//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
}
Ananth Kumar Vasamsetti
sumber
0

Saya memiliki masalah yang sama, ternyata saya web.configtidak sama dengan rekan satu tim saya. Jadi tolong periksa web.config.

Semoga ini bisa membantu seseorang.

Roshna Omer
sumber
-1

Masalah

window.JSON.parse memunculkan kesalahan pada fungsi $ .parseJSON.

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

Solusi saya

Overloading JQuery menggunakan alat needsejs .

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

konten file jquery.overload.js

<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>
Christian MEROUR
sumber
-1

Jika Anda tidak ingin menghapus / mengubahdataType: json , Anda dapat mengganti penguraian ketat jQuery dengan mendefinisikan sebuah kustom 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 {};
            }
        }
    },

    ...

Dengan menggunakan ini, Anda dapat menyesuaikan perilaku ketika respons tidak dapat diuraikan sebagai JSON (bahkan jika Anda mendapatkan badan tanggapan yang kosong!)

Dengan konverter kustom ini, .done()/ successakan dipicu selama permintaan itu dinyatakan berhasil (kode respons 1xx atau 2xx).

alexw
sumber