아약스 요청에 대해 "파서 오류"를 반환하는 jQuery


186

Ajax 요청에 대해 jquery에서 "parsererror"를 얻은 후 POST를 GET으로 변경하여 몇 가지 다른 방식으로 데이터를 반환하려고 시도했지만 (클래스 생성 등) 문제가 무엇인지 파악할 수 없습니다.

내 프로젝트는 MVC3에 있으며 jQuery 1.5를 사용하고 있습니다. 드롭 다운이 있고 onchange 이벤트에서 선택한 항목을 기반으로 데이터를 가져 오기 위해 호출을 시작합니다.

드롭 다운 : (이것은 Viewbag의 목록에서 "Views"를로드하고 이벤트를 실행하면 정상적으로 작동합니다)

@{
    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)

자바 스크립트 :

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는 "parsererror"라는 $ .ajax () 메소드에 대한 오류 이벤트를 발생시킵니다.


콘솔에서 자바 스크립트 오류를 ​​발생 시키거나 $ .ajax () 명령의 "오류"핸들러 함수가 실행됩니까?
— arnorhs

더 구체적으로 말하면 $ .ajax () 오류 함수 {alert ( "Error"); }
— dkarzon

라이브 링크의 기회가 있습니까? Firebug에 표시하는 JSON 데이터가 보입니까?
— Pekka

아니요 라이브 링크가 없습니다. 그러나 그렇습니다 .Firebug에 표시된 JSON 응답입니다.
— dkarzon 2019

그렇습니다, 나의 나쁜 것은 오타였습니다. 질문 수정
— dkarzon

답변:


306

최근 에이 문제가 발생 하여이 질문에 걸려 들었습니다.

훨씬 쉬운 방법으로 해결했습니다.

방법 1

dataType: 'json'객체 리터럴에서 속성을 제거 할 수 있습니다 ...

방법 2

또는 데이터를로 반환하여 @Sagiv가 말한 것을 수행 할 수 있습니다 Json.


이 parsererror메시지가 나타나는 이유 는 단순히 문자열이나 다른 값을 반환 할 때 실제로 그렇지 않기 Json때문에 구문 분석시 구문 분석기가 실패하기 때문입니다.

따라서 dataType: json속성 을 제거하면 속성을로 구문 분석하지 않습니다 Json.

다른 방법으로 데이터를로 반환 Json하면 파서는 데이터를 올바르게 처리하는 방법을 알게됩니다.


4
고마워 David, Method One이 나를 위해 일했다. 내 경우에는 아무것도 반환하지 않았지만 실수로 데이터 유형을 사용했습니다. 팁 고마워.
— Krishna Teja Veeramachaneni 2016 년

답변 주셔서 감사합니다, 나는 더 나은 솔루션처럼 보이는 퀘스트에 대한 답변을 업데이트했습니다.
— dkarzon

내 PHP 스크립트에 오류가 있고 JSON이 아닌 데이터를 반환 할 때이 문제가 발생했습니다 dataType . 실제로 비활성화하는 유용한 제안입니다 !
— Sharadh

감사합니다! 이는 JQuery AJAX 메소드를 사용하는 jquery.fileupload.js 및 기타 라이브러리에도 적용됩니다. 혼란스러운 오류 메시지!
— 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

ajax 호출 응답 dataType 을 다음과 같이 지정 했습니다.

'json'

실제 아약스 응답이 유효한 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 2018 년


4

제거 할 제안이 많이 있습니다

dataType: "json"

이것이 효과가 있음을 인정하지만 근본적인 문제는 무시하고 있습니다. 리턴 문자열이 실제로 JSON이라고 확신하는 경우 응답 시작시 잘못된 공백을 찾으십시오. 피들러에서 살펴보십시오. 광산은 다음과 같습니다.

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

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

필자의 경우 이것은 PHP가 원하지 않는 문자 (이 경우 UTF 파일 BOM)를 뿜어내는 문제입니다. 이것을 제거하면 문제를 해결하면서도 문제를 해결했습니다.

dataType: json

이것에 동의하십시오 ... 응답을 확인했으며 앱에서 어딘가에 손실 된 var_dump ()였습니다.
— 척

2

의도하지 않은 정보를 출력 할 수있는 디버그 코드 나 그 밖의 것을 제거하십시오. 다소 명백하지만, 순간에 잊기 쉽다.


0

이것이 여전히 실제인지는 모르지만 문제는 인코딩에 관한 것입니다. ANSI로 변경하면 문제가 해결되었습니다.


0

IE에서 HTTP GET을 사용 하여이 문제가 발생하면 캐시를 설정 하여이 문제를 해결했습니다. 거짓. HTML 및 json 요청 모두에 동일한 URL을 사용했기 때문에 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 파서는 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

web .net mvc / api에서 Get 작업을하는 경우 get을 허용해야합니다.

     return Json(data,JsonRequestBehavior.AllowGet);

0

또한 "오류 : parsererror와 함께 요청 반환"이 표시되었습니다. 자바 스크립트 콘솔에서. 필자의 경우 Json의 문제는 아니지만보기 텍스트 영역에 유효한 인코딩을 전달해야했습니다.

  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>

내 솔루션

requirejs 도구를 사용하여 JQuery를 오버로드합니다 .

<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으로 구문 분석 할 수없는 경우 동작을 사용자 정의 할 수 있습니다.

이 사용자 정의 변환기 를 사용하면 요청이 성공한 경우 (1xx 또는 2xx 응답 코드) .done()/ success가 트리거됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.