jQuery trả lại các trình phân tích cú pháp của Google cho yêu cầu ajax


186

Nhận được một "trình phân tích cú pháp" từ jquery cho một yêu cầu Ajax, tôi đã thử thay đổi POST thành GET, trả lại dữ liệu theo một số cách khác nhau (tạo các lớp, v.v.) nhưng dường như tôi không thể hiểu được vấn đề là gì.

Dự án của tôi là trong MVC3 và tôi đang sử dụng jQuery 1.5 Tôi có Dropdown và trong sự kiện onchange, tôi thực hiện cuộc gọi để nhận một số dữ liệu dựa trên những gì đã được chọn.

Thả xuống: (điều này tải "Lượt xem" từ danh sách trong Viewbag và kích hoạt sự kiện hoạt động tốt)

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

Đoạn mã trên gọi thành công phương thức MVC và trả về:

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

Nhưng jquery kích hoạt sự kiện lỗi cho phương thức $ .ajax () có nội dung "trình phân tích cú pháp".


nó có phát sinh lỗi javascript trong bàn điều khiển không hoặc hàm xử lý "lỗi" của lệnh $ .ajax () có được thực thi không?
arnorhs

xin lỗi, đáng lẽ phải cụ thể hơn, nó kích hoạt hàm lỗi $ .ajax () {alert ("Error"); }
dkarzon

Bất kỳ cơ hội của một liên kết trực tiếp? Bạn có thấy dữ liệu JSON mà bạn hiển thị trong Fireorms không?
Pekka

Không tôi không có một liên kết trực tiếp. Nhưng vâng, đó là phản hồi JSON được hiển thị trong Fireorms.
dkarzon

vâng, xấu của tôi là một lỗi đánh máy. Đã sửa câu hỏi
dkarzon

Câu trả lời:


306

Gần đây tôi đã gặp phải vấn đề này và vấp phải câu hỏi này.

Tôi giải quyết nó với một cách dễ dàng hơn nhiều.

Phương pháp một

Bạn có thể xóa thuộc dataType: 'json'tính khỏi đối tượng theo nghĩa đen ...

Phương pháp hai

Hoặc bạn có thể làm những gì @Sagiv đã nói bằng cách trả lại dữ liệu của bạn dưới dạng Json.


Lý do tại sao parsererrorthông báo này xảy ra là khi bạn chỉ cần trả về một chuỗi hoặc một giá trị khác, nó không thực sự Json, vì vậy trình phân tích cú pháp thất bại khi phân tích cú pháp.

Vì vậy, nếu bạn loại bỏ dataType: jsontài sản, nó sẽ không cố phân tích nó thành Json.

Với phương pháp khác nếu bạn đảm bảo trả về dữ liệu của mình Json, trình phân tích cú pháp sẽ biết cách xử lý dữ liệu đúng cách.


4
Cảm ơn David, Phương pháp Một đã làm việc cho tôi. Trong trường hợp của tôi, tôi không trả lại bất cứ thứ gì ngoài việc sử dụng một kiểu dữ liệu do nhầm lẫn. Cảm ơn vì tiền hỗ trợ.
Krishna Teja Veeramachaneni

Cảm ơn phản hồi, tôi đã cập nhật câu trả lời cho nhiệm vụ vì đây có vẻ là một giải pháp tốt hơn.
dkarzon

Tôi gặp phải vấn đề này khi tập lệnh php của tôi gặp lỗi và đang trả về dữ liệu không phải là JSON - một đề xuất hữu ích để vô hiệu hóa dataType thực sự!
Sharadh

Cảm ơn bạn! Điều này cũng áp dụng cho jquery.fileupload.js và các thư viện khác bằng cách sử dụng các phương thức AJAX của JQuery. Thông báo lỗi khó hiểu!
kqr

Tôi đang gặp vấn đề này khi sử dụng Rails jquery-ujs
Donato

29

Xem câu trả lời của @ david-East để biết cách xử lý vấn đề chính xác

Câu trả lời này chỉ liên quan đến một lỗi với jQuery 1.5 khi sử dụng tệp: giao thức.

Tôi đã gặp một vấn đề tương tự gần đây khi nâng cấp lên jQuery 1.5. Mặc dù nhận được một phản ứng chính xác, xử lý lỗi bị sa thải. Tôi đã giải quyết nó bằng cách sử dụng completesự kiện và sau đó kiểm tra giá trị trạng thái. ví dụ:

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

1
Đã xác nhận cố định trong JQuery 1.5.1
johnhunter

13
Tôi gặp vấn đề này trong 1.7.2 :(
Eystein Bye

6
Tôi chỉ gặp vấn đề này, nhưng tôi đã xóa kiểu dữ liệu: 'json' và vấn đề đã được giải quyết. Vì nó không trả về một hình thức thực sự, nó sẽ gặp lỗi trình phân tích cú pháp.
David East

3
Tôi đang gặp vấn đề này trong 1.9.1 và tôi đã khắc phục bằng cách API của tôi trả về hàm băm trống {}. Xấu hổ điều này là cần thiết.
Adam T Ink

4
Điều này thực sự có trong tài liệu: ...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

Bạn đã xác định câu trả lời cuộc gọi ajax datatype như:

'json'

trong đó phản hồi ajax thực tế không phải là JSON hợp lệ và kết quả là trình phân tích cú pháp JSON bị lỗi.

Cách tiếp cận tốt nhất mà tôi muốn giới thiệu là thay đổi dataType thành:

'bản văn'

và trong cuộc gọi lại thành công xác thực xem JSON có hợp lệ được trả lại hay không và nếu xác thực JSON không thành công, hãy thông báo cho nó trên màn hình để rõ ràng mục đích của cuộc gọi ajax thực sự là thất bại. Có một cái nhìn tại đây:

$.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
hoặc xóa kiểu dữ liệu :)
Alexander

10

vấn đề là bộ điều khiển của bạn trả về chuỗi hoặc đối tượng khác không thể được phân tích cú pháp. cuộc gọi ajax dự kiến ​​sẽ lấy lại Json. cố gắng trả lại JsonResult trong bộ điều khiển như thế:

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

    }

hy vọng nó giúp :)


Xin lỗi, đã quên bao gồm cơ sở mã của tôi, nhưng đó chính xác là cách Json được trả lại.
dkarzon


4

Có rất nhiều gợi ý để loại bỏ

dataType: "json"

Trong khi tôi cho rằng điều này hoạt động thì nó bỏ qua vấn đề tiềm ẩn. Nếu bạn tự tin chuỗi trả về thực sự là JSON thì hãy tìm khoảng trắng sai lầm khi bắt đầu phản hồi. Xem xét có một cái nhìn vào nó trong fiddler. Của tôi trông như thế này:

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

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

Trong trường hợp của tôi, đây là một vấn đề với PHP phun ra các ký tự không mong muốn (trong trường hợp này là BOM tệp UTF). Khi tôi gỡ bỏ nó, nó đã khắc phục vấn đề trong khi vẫn giữ

dataType: json

Đồng ý với điều này ... Tôi đã kiểm tra phản hồi và đó là một var_dump () đã bị mất ở đâu đó trong ứng dụng.
Chuck

2

Đảm bảo rằng bạn xóa bất kỳ mã gỡ lỗi hoặc bất kỳ điều gì khác có thể xuất ra thông tin ngoài ý muốn. Hơi rõ ràng, nhưng dễ quên trong lúc này.


0

Tôi không biết nếu điều này vẫn còn thực tế nhưng vấn đề là ở Mã hóa. Thay đổi thành ANSI đã giải quyết vấn đề cho tôi.


0

Nếu bạn gặp vấn đề này khi sử dụng HTTP GET trong IE, tôi đã giải quyết vấn đề này bằng cách đặt bộ đệm: false. Vì tôi đã sử dụng cùng một url cho cả hai yêu cầu HTML và json, nó nhấn vào bộ đệm thay vì thực hiện cuộc gọi 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

bạn nên xóa dataType: "json". Sau đó, hãy xem phép thuật ... lý do của việc làm như vậy là bạn đang chuyển đổi đối tượng json thành chuỗi đơn giản .. vì vậy trình phân tích cú pháp json không thể phân tích chuỗi đó do không phải là đối tượng 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

bao gồm hoạt động Nhận từ web .net mvc / api, đảm bảo bạn được phép lấy

     return Json(data,JsonRequestBehavior.AllowGet);

0

Tôi cũng đã nhận được "Yêu cầu trả lại có lỗi: trình phân tích cú pháp." trong bảng điều khiển javascript. Trong trường hợp của tôi, đó không phải là vấn đề của Json, nhưng tôi phải chuyển đến vùng xem văn bản một mã hóa hợp lệ.

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

0

Tôi đã gặp phải lỗi như vậy nhưng sau khi sửa đổi phản hồi của tôi trước khi gửi nó cho khách hàng thì nó vẫn hoạt động tố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

Tôi có cùng một vấn đề, hóa ra tôi web.configkhông giống với các đồng đội của mình. Vì vậy, vui lòng kiểm tra của bạn web.config.

Hy vọng điều này sẽ giúp được ai đó.


-1

Vấn đề

window.JSON.parse gây ra lỗi trong hàm $ .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>

Giải pháp của tôi

Quá tải JQuery bằng cách sử dụng công cụ allowjs .

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

nội dung tệp 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

Nếu bạn không muốn xóa / thay đổidataType: json , bạn có thể ghi đè phân tích cú pháp nghiêm ngặt của jQuery bằng cách xác định một tùy chỉnh 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 {};
            }
        }
    },

    ...

Sử dụng điều này, bạn có thể tùy chỉnh hành vi khi phản hồi không thể được phân tích cú pháp dưới dạng JSON (ngay cả khi bạn nhận được phần thân phản hồi trống!)

Với trình chuyển đổi tùy chỉnh này, .done()/ successsẽ được kích hoạt miễn là yêu cầu thành công (mã phản hồi 1xx hoặc 2xx).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.