web-dev-qa-db-ja.com

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

Ajaxリクエストのためにjqueryから "parsererror"を取得しています、私はPOSTをGETに変更してみました。問題は何ですか。

私のプロジェクトはMVC3にあり、私はjQuery 1.5を使っています私はDropdownを持っています、そして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)

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"を発行します。

165
dkarzon

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

私ははるかに簡単な方法でそれを解決しました。

方法1

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

方法2

あるいは、データをJsonとして返すことで@Sagivが言っていたことを実行できます。


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

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

他の方法では、データをJsonとして返すようにした場合、パーサーはそれを適切に処理する方法を認識します。

269
David East

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

この回答は、file:protocolを使用した場合の jQuery 1.5のバグ にのみ関係します。

JQuery 1.5にアップグレードするとき、私は最近同様の問題を抱えていました。正しい応答が得られたにもかかわらず、エラーハンドラは起動しました。 completeイベントを使用してステータス値を確認することで解決しました。例えば:

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

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);
    }
});
15
Nadeem Khan

問題は、あなたのコントローラが文字列や他の解析できないオブジェクトを返すことです。 ajaxの呼び出しではJsonが返ってくると期待されていました。そのようなコントローラーでJsonResultを返すようにしてください。

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

    }

それが役に立てば幸い :)

10
Sagiv Ofek

あなたのJSONデータは間違っているかもしれません。 http://jsonformatter.curiousconcept.com/ 検証する.

5
Vishal Sakaria

削除する提案がたくさんあります

dataType: "json"

これはうまくいくと私は認めるが、根本的な問題は無視している。戻り文字列が実際にJSONであると確信している場合は、応答の先頭で誤った空白を探してください。フィドラーでそれを見てみることを検討してください。私のものはこんな感じでした:

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

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

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

dataType: json
4
Sam Strachan

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

1
Jahmic

web .net mvc/apiからのGet操作の場合は、getが許可されていることを確認してください。

     return Json(data,JsonRequestBehavior.AllowGet);
0
Mohamed.Abdo

また、「エラーが発生した場合の戻り要求:parsererror」と表示されました。 JavaScriptコンソールで。私の場合はJsonの問題ではありませんでしたが、ビューテキスト領域に有効なエンコードを渡す必要がありました。

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

dataType: "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
Sandipan Ghosh

私は同じ問題を抱えていた、私のweb.configは私のチームメイトと同じではなかったことがわかった。それであなたのweb.configをチェックしてください。

これが誰かに役立つことを願っています。

0
Roshna Omer

これがまだ実際のものであるかどうかはわかりませんが、問題はEncodingにあります。 ANSIに変更することは私にとって問題を解決しました。

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
}

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
Stuart