jQueryがajaxリクエストに対して「parsererror」を返す


186

Ajaxリクエストのjqueryから「parsererror」を取得しているので、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」と言うエラーイベントを発生させます。


コンソールでjavascriptエラーが発生しますか、それとも$ .ajax()コマンドの「エラー」ハンドラー関数が実行されますか?
arnorhs

申し訳ありませんが、もっと具体的だったはずですが、$。ajax()エラー関数を呼び出します{alert( "Error"); }
dkarzon

ライブリンクの可能性はありますか?Firebugに表示するJSONデータは表示されますか?
ペッカ

いいえ、ライブリンクはありません。しかし、はい、それはFirebugに表示されるJSON応答です。
dkarzon

うん、悪いのはタイプミスだった。質問を修正
dkarzon

回答:


306

私は最近この問題に遭遇し、この質問に遭遇しました。

もっと簡単な方法で解決しました。

方法1

dataType: 'json'オブジェクトリテラルからプロパティを削除することもできます...

方法2

または、@ Sagivが言っていたように、データをとして返すこともできますJson


このparsererrorメッセージが表示される理由は、単に文字列または別の値を返す場合は実際にJsonはそうではないため、パーサーが解析時に失敗するためです。

そのため、dataType: jsonプロパティを削除しても、として解析されませんJson

他の方法では、データを必ずとして返す場合Json、パーサーはそれを適切に処理する方法を知っています。


4
Davidに感謝します。MethodOneが役に立ちました。私の場合、何も返さなかったが、誤ってデータ型を使用した。先端をありがとう。
Krishna Teja Veeramachaneni 2013年

回答のおかげで、これはより良い解決策のように見えるので、クエストの回答を更新しました。
dkarzon 14

私のphpスクリプトにエラーがあり、JSON以外のデータを返していたときにこの問題が発生しましたdataType
Sharadh 2014年

ありがとうございました!これは、jquery.fileupload.jsおよびJQuery AJAXメソッドを使用するその他のライブラリにも適用されます。紛らわしいエラーメッセージ!
kqr 2016年

私はRailsのjqueryの-UJSを使用してこの問題を取得しています
ドナート

29

問題を処理する正しい方法については、@ david-eastの回答を参照してください

この回答は、file:プロトコルを使用する場合の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 '25

13
私は1.7.2でこの問題を抱えています:(
Eystein Bye

6
私はこの問題を抱えていましたが、データ型 'json'を削除し、問題は解決しました。jsonからtrueフォームが返されないため、パーサーエラーが発生します。
デビッドイースト

3
1.9.1でこの問題が発生しています。APIで空のハッシュを返すようにして問題を回避しました{}。これは恥ずべきことです。
アダム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」

実際の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...

私の場合、これは不要な文字(この場合はUTFファイルBOM)をPHPが吐き出す問題でした。私がこれらを削除すると、それを維持しながら問題を修正しました

dataType: json

これに同意します...応答を確認しましたが、アプリのどこかで失われたのはvar_dump()でした。
チャック

2

意図しない情報を出力している可能性のあるデバッグコードやその他のものを必ず削除してください。ある程度明白ですが、現時点では忘れがちです。


0

これがまだ実際にあるかどうかはわかりませんが、問題はエンコーディングにありました。ANSIに変更すると、問題は解決しました。


0

IEでHTTP GETを使用してこの問題が発生した場合は、キャッシュをfalseに設定してこの問題を解決しました。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

また、「error:parsererrorを使用したリクエストリターン」も取得していました。JavaScriptコンソールで。私の場合、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.