jQuery ส่งคืน“ parsererror” สำหรับคำขอ ajax


186

เมื่อได้รับ "parsererror" จาก jquery สำหรับคำขอ Ajax ฉันได้ลองเปลี่ยน POST เป็น GET โดยส่งคืนข้อมูลในรูปแบบต่าง ๆ (การสร้างคลาส ฯลฯ ) แต่ฉันดูเหมือนจะไม่เข้าใจว่าปัญหาคืออะไร

โครงการของฉันอยู่ใน MVC3 และฉันใช้ jQuery 1.5 ฉันมีดร็อปดาวน์และในเหตุการณ์ onchange ฉันปิดการโทรเพื่อรับข้อมูลบางอย่างจากสิ่งที่ถูกเลือก

ดร็อปดาวน์: (สิ่งนี้จะโหลด "มุมมอง" จากรายการใน Viewbag และเริ่มการทำงานของเหตุการณ์ได้ดี)

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

โค้ดด้านบนเรียกวิธี MVC และส่งคืนได้สำเร็จ:

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

แต่ jquery เริ่มเหตุการณ์ข้อผิดพลาดสำหรับวิธี $ .ajax () ที่พูดว่า "parsererror"


มันทำให้เกิดข้อผิดพลาดจาวาสคริปต์ในคอนโซลหรือไม่หรือฟังก์ชั่นการจัดการ "ข้อผิดพลาด" ของคำสั่ง $ .ajax () ได้รับการดำเนินการหรือไม่
arnorhs

ขออภัยควรมีความเฉพาะเจาะจงมากขึ้นและจะเปิดใช้งานฟังก์ชันข้อผิดพลาด $ .ajax () {alert ("Error"); }
dkarzon

โอกาสใด ๆ ของลิงค์สด? คุณเห็นข้อมูล JSON ที่คุณแสดงใน Firebug หรือไม่
Pekka

ไม่ฉันไม่มีลิงก์แบบสด แต่ใช่นั่นคือการตอบสนอง JSON ที่แสดงใน Firebug
dkarzon

ใช่ฉันไม่ดีเป็นตัวพิมพ์ผิด แก้ไขคำถาม
dkarzon

คำตอบ:


306

ฉันเพิ่งพบปัญหานี้และสะดุดกับคำถามนี้

ฉันแก้ไขมันด้วยวิธีที่ง่ายกว่ามาก

วิธีที่หนึ่ง

คุณสามารถลบdataType: 'json'คุณสมบัติออกจากตัวอักษรของวัตถุ ...

วิธีที่สอง

หรือคุณสามารถทำสิ่งที่ @Sagiv Jsonพูดโดยการกลับข้อมูลของคุณ


เหตุผลที่parsererrorข้อความนี้เกิดขึ้นคือเมื่อคุณเพียงแค่ส่งคืนสตริงหรือค่าอื่นมันไม่จริงJsonดังนั้น parser จึงล้มเหลวเมื่อทำการแยกวิเคราะห์

ดังนั้นถ้าคุณเอาทรัพย์สินก็จะไม่พยายามที่จะแยกเป็นdataType: jsonJson

ด้วยวิธีอื่นถ้าคุณแน่ใจว่าได้คืนข้อมูลของคุณJsonแล้วโปรแกรมแยกวิเคราะห์จะรู้วิธีจัดการอย่างถูกต้อง


4
ขอบคุณ David วิธีที่หนึ่งใช้ได้กับฉัน ในกรณีของฉันฉันไม่ได้คืนสิ่งใด แต่ใช้ประเภทข้อมูลโดยไม่ได้ตั้งใจ ขอบคุณสำหรับทิป.
กฤษณะ Teja Veeramachaneni

ขอบคุณสำหรับการตอบกลับฉันได้อัปเดตคำตอบสำหรับภารกิจเนื่องจากดูเหมือนว่าจะเป็นทางออกที่ดีกว่า
dkarzon

ฉันพบปัญหานี้เมื่อสคริปต์ PHP ของฉันมีข้อผิดพลาดและส่งคืนข้อมูลที่ไม่ใช่ JSON - คำแนะนำที่มีประโยชน์เพื่อปิดใช้งานdataType แน่นอน!
Sharadh

ขอบคุณ! สิ่งนี้ใช้กับ jquery.fileupload.js และไลบรารีอื่น ๆ โดยใช้วิธีการ JQuery AJAX ข้อความแสดงข้อผิดพลาดที่สับสน!
kqr

ฉันได้รับปัญหานี้โดยใช้ Rails jquery-ujs
Donato

29

ดูคำตอบโดย @ david-east สำหรับวิธีที่ถูกต้องในการจัดการปัญหา

คำตอบนี้เกี่ยวข้องกับบั๊กที่มี jQuery 1.5 เท่านั้นเมื่อใช้ไฟล์: โปรโตคอล

ฉันมีปัญหาที่คล้ายกันเมื่อเร็ว ๆ นี้เมื่ออัพเกรดเป็น jQuery 1.5 แม้จะได้รับการตอบสนองที่ถูกต้องตัวจัดการข้อผิดพลาดก็เริ่มทำงาน ฉันแก้ไขมันโดยใช้completeเหตุการณ์แล้วตรวจสอบค่าสถานะ เช่น:

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

1
ยืนยันแล้วใน JQuery 1.5.1
johnhunter

13
ฉันมีปัญหานี้ใน 1.7.2 :(
Eystein Bye

6
ฉันเพิ่งมีปัญหานี้ แต่ฉันลบประเภทข้อมูล: 'json' และปัญหาได้รับการแก้ไข เนื่องจากไม่ได้ส่งคืนฟอร์มจริง json จึงจะพบข้อผิดพลาดในการแยกวิเคราะห์
David East

3
ฉันมีปัญหานี้ใน 1.9.1 และฉันได้รอบโดยมี API {}ของฉันกลับกัญชาที่ว่างเปล่า ความอัปยศนี้เป็นสิ่งที่จำเป็น
Adam Tuttle

4
อันนี้เป็นจริงในเอกสารประกอบ: ...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

คุณระบุdataType ajax call response เป็น:

'JSON'

โดยที่การตอบกลับ ajax ที่แท้จริงไม่ใช่ JSON ที่ถูกต้องและด้วยเหตุนี้ตัวแยกวิเคราะห์ JSON กำลังโยนข้อผิดพลาด

วิธีที่ดีที่สุดที่ฉันอยากจะแนะนำคือเปลี่ยนdataTypeเป็น:

'ข้อความ'

และภายในการเรียกกลับสำเร็จจะตรวจสอบว่ามีการส่งคืน JSON ที่ถูกต้องหรือไม่และหากการตรวจสอบ JSON ล้มเหลวให้แจ้งเตือนบนหน้าจอเพื่อให้ชัดเจนว่ามีวัตถุประสงค์อะไรที่การโทร ajax ล้มเหลว ดูที่นี้:

$.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
หรือลบประเภทข้อมูล :)
Alexander

10

ปัญหาคือว่าคอนโทรลเลอร์ของคุณส่งคืนสตริงหรือวัตถุอื่นที่ไม่สามารถแยกวิเคราะห์ได้ การโทร ajax ที่คาดว่าจะได้รับ Json ในทางกลับกัน ลองส่งคืน JsonResult ในคอนโทรลเลอร์ดังนี้:

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

    }

หวังว่ามันจะช่วย :)


ขออภัยลืมที่จะรวมโค้ดของฉันไว้ด้านหลัง แต่นั่นเป็นวิธีที่ Json ถูกส่งคืน
dkarzon


4

มีคำแนะนำจำนวนมากที่จะลบ

dataType: "json"

ในขณะที่ฉันอนุญาตให้ใช้งานได้ก็ไม่สนใจปัญหาพื้นฐาน หากคุณมั่นใจว่าสตริงส่งคืนเป็น JSON จริงๆให้มองหาช่องว่างที่ผิดเพี้ยนที่จุดเริ่มต้นของการตอบกลับ พิจารณาดูในพู้ทำเล่น ฉันมีลักษณะเช่นนี้:

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

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

ในกรณีของฉันปัญหานี้เกิดขึ้นกับ PHP พ่นอักขระที่ไม่ต้องการออก (ในกรณีนี้คือไฟล์ BOM UTF) เมื่อฉันลบสิ่งเหล่านี้มันจะแก้ไขปัญหาในขณะที่ยังรักษาอยู่

dataType: json

เห็นด้วยกับสิ่งนี้ ... ฉันตรวจสอบการตอบสนองและมันเป็น var_dump () ที่หายไปที่ไหนสักแห่งในแอป
Chuck

2

ตรวจสอบให้แน่ใจว่าคุณลบรหัสการดีบักหรือสิ่งอื่นใดที่อาจแสดงผลข้อมูลที่ไม่ได้ตั้งใจ ค่อนข้างชัดเจน แต่ง่ายที่จะลืมในขณะนี้


0

ฉันไม่รู้ว่านี่ยังคงเป็นจริงหรือไม่ แต่ปัญหาเกิดจากการเข้ารหัส การเปลี่ยนเป็น ANSI แก้ปัญหาให้ฉันได้


0

หากคุณได้รับปัญหานี้โดยใช้ HTTP GET ใน IE ฉันแก้ไขปัญหานี้ได้โดยการตั้งค่าแคช: false ในขณะที่ฉันใช้ URL เดียวกันสำหรับทั้ง HTML และ json ขอให้มันเข้าสู่แคชแทนการโทร 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");
    }
});

0

คุณควรลบ dataType: "json" จากนั้นดูความมหัศจรรย์ ... เหตุผลในการทำสิ่งนี้คือคุณกำลังแปลงวัตถุ json เป็นสตริงอย่างง่าย .. ดังนั้น json parser จึงไม่สามารถแยกสตริงนั้นได้เนื่องจากไม่ใช่วัตถุ 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");
    }
 });
};

0

ในกรณีของการดำเนินการรับจากเว็บ. net mvc / api ตรวจสอบให้แน่ใจว่าคุณได้รับอนุญาต

     return Json(data,JsonRequestBehavior.AllowGet);

0

ฉันยังได้รับ "คำขอคืนพร้อมข้อผิดพลาด: parsererror" ในคอนโซล javascript ในกรณีของฉันมันไม่ใช่เรื่องของ Json แต่ฉันต้องผ่านการเข้ารหัสที่ถูกต้องไปยัง text view

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

0

ฉันพบข้อผิดพลาดดังกล่าว แต่หลังจากแก้ไขการตอบสนองของฉันก่อนที่จะส่งไปยังลูกค้ามันทำงานได้ดี

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

ฉันมีปัญหาเดียวกันกลับกลายเป็นว่าฉันweb.configไม่เหมือนกันกับเพื่อนร่วมทีม web.configดังนั้นกรุณาตรวจสอบของคุณ

หวังว่านี่จะช่วยใครซักคน


-1

ปัญหา

window.JSON.parse ทำให้เกิดข้อผิดพลาดในฟังก์ชั่น $ .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>

ทางออกของฉัน

มากไป JQuery ใช้เครื่องมือ requirejs

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

เนื้อหาไฟล์ 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>

-1

หากคุณไม่ต้องการลบ / เปลี่ยนแปลงdataType: jsonคุณสามารถแทนที่การแยกวิเคราะห์แบบเข้มงวดของ jQuery โดยการกำหนดแบบกำหนดเอง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 {};
            }
        }
    },

    ...

เมื่อใช้สิ่งนี้คุณสามารถปรับแต่งพฤติกรรมเมื่อไม่สามารถแยกวิเคราะห์คำตอบเป็น JSON (แม้ว่าคุณจะได้รับเนื้อหาการตอบสนองที่ว่างเปล่า!)

ด้วยตัวแปลงที่กำหนดเองนี้.done()/ successจะถูกเรียกใช้ตราบเท่าที่คำขอประสบความสำเร็จเป็นอย่างอื่น (รหัสตอบกลับ 1xx หรือ 2xx)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.