아약스 요청에 대해 "파서 오류"를 반환하는 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.