web-dev-qa-db-ja.com

jQuery getJSON-ajax parseerror

次のjson応答をJQuery getJSONとajaxの両方で解析しようとしました:

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}]

また、次のように「/」文字をエスケープしてみました。

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview <\/h1><h1>January 29, 2009<\/h1>"}]

GetJSONを使用すると、コールバックが実行されません。だから、私は次のようにJQuery ajaxでそれを試しました:

$.ajax({
    url: jURL,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    beforeSend: function(x) {
        if(x && x.overrideMimeType) {
            x.overrideMimeType("application/j-son;charset=UTF-8");
        }
    },
    success: function(data){
        wId = data.iId;
        $("#txtHeading").val(data.heading);
        $("#txtBody").val(data.body);
        $("#add").slideUp("slow");
        $("#edit").slideDown("slow");
    },//success
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown);
    }
});

Ajaxがエラーにヒットし、次の警告が出されます。

XMLHttpRequest=[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview </h1><h1>January 29, 2009</h1>"}]

textStatus=parseerror

errorThrown=undefined

次に、次のコードを使用してJSONを返す簡単なJQuery get呼び出しを試しました。

$.get(jURL,function(data){
    var json = eval("("+data+");");
    wId = json.iId;
    $("#txtHeading").val(json.heading);
    $("#txtBody").val(json.body);
    $("#add").slideUp("slow");
    $("#edit").slideDown("slow");
})

.getはJSONを返しますが、JSONをどのように変更したかに関係なく、evalでエラーが発生します(コンテンツタイプヘッダー、フォーマットの他のバリエーションなど)。

私が思いついたのは、JSONでHTMLを返し、それを解析する際に問題があるようだということです。ただし、JSONを介してこのデータを取得できるようにするために何かを見逃していたことを願っています。誰かアイデアはありますか?

15
JW

あなたが持っているJSON文字列は、その中に1つのオブジェクトを持つ配列なので、オブジェクトにアクセスするには、最初に配列にアクセスする必要があります。次のようなjson.phpを使用します。

[
    {
        "iId": "1",
        "heading": "Management Services",
        "body": "<h1>Program Overview</h1><h1>January 29, 2009</h1>"
    }
]

私はこれを試しました

$.getJSON("json.php", function(json) {
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1>
    alert(json[0].heading); // "Management Services"
    alert(json[0].iId); // "1"
});

私もこれを試しました:

$.get("json.php", function(data){
    json = eval(data);
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1>
    alert(json[0].heading); // "Management Services"
    alert(json[0].iId); // "1" 
});

そして、彼らは両方とも私のためにうまく働きました。

7

それでも問題が解決しない場合は、JSON文字列とコンテンツタイプ「application/json」である必要があります。

Asp.net(c#)でのHTTPの例:

public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json";
        context.Response.Write("{ status: 'success' }");
    }

hth、

マティ

3
user291586

Firebug Liteを無効にすると、この問題が修正されました。

jQuery 1.4、ajax/json、Firebug LiteおよびIE 8 の組み合わせのバグ==

1

JsonDataの前と最後の[]を削除すると、機能します。

1
user263473

質問には構文エラーがあることにご注意ください。との行

x.overrideMimeType("application/j-son;charset=UTF-8");

読むべき

x.overrideMimeType("application/json; charset=UTF-8");

これも大きな違いになります。

1
Philip Schlump

あなたはそれをテキストとして返し、そしてそれを json.orgパーサー で解析することができます
動作が異なるかどうかを確認するには

1
cobbal

これは実際の例であり、テスト済みです!

<script type="text/javascript">

function fetchData() {
var dataurl = "pie.json";
$.ajax({
    url: dataurl,
    cache: false,
    method: 'GET',
    dataType: 'json',
    success:  function(series) {
        var data = [];
        //alert(series.length);
        for (var i=0; i<series.length;i++){
            data[i]=series[i];
        }

        $.plot(
                $("#placeholder"), 
                data, 
                {
                     series: {
                       pie: {
                         show: true,
                         label: {
                           show: true
                         }
                     }
                    },
                    legend: {
                      show: true
                    }
                  }
       );
     }
});

   //setTimeout(fetchData, 1000);
}
</script>

そして、jsonソースは次のとおりです(pie.json):

[{ "label": "Series1",  "data": 10},
{ "label": "Series2",  "data": 30},
{ "label": "Series3",  "data": 90},
{ "label": "Series4",  "data": 70},
{ "label": "Series5",  "data": 80},
{ "label": "Series6",  "data": 110}]
1
fureszpeter

まず、問題が一般的なJSONエンコード/デコードにあるかどうかを正確に特定してみます。数値とプレーンな文字列を使用して、引用符で囲まれたHTMLを使用して、より単純なオブジェクトを試してください。

JSONを動作させたら、HTMLをそこから削除することを検討する必要があります。データだけを移動し、プレゼンテーションの詳細はテンプレートに任せる方がはるかに優れています。 AJAXを使用する場合、これはHTMLの非表示のテンプレートを意味し、jQueryを使用してそれを複製し、データを入力します。 jQuery テンプレートプラグイン のいずれかを確認します。これらのうち、 jTemplates が一般的なお気に入りです。

0
Javier

私の場合、エラーはjsonのhtmlタグが原因でした。

INCORRECT(parsererror)

{"msg": "Gracias,< br >Nos pondremos en contacto."}

正しい

{"msg": "Gracias, nos pondremos en contacto."}

ブラウザ:IE7/IE8

0
Jorge Olivares

あなたは間違った質問をしていると思います。 $ .getJSON()を使用する方がはるかに簡単です。問題が発生した場合は、$。ajax()ではなく$ .getJSON()を使用することをお勧めします。 getJSON関数のソースコードを見ると便利な場合もあります。これは、mimeTypesを使用すると役に立たないものがたくさんあるためです。それは方法ではありません。

0
Thinker

解析しようとしている値は、角括弧[]で囲まれています。これは、配列であることを意味します。配列を評価しようとしています。配列の最初の要素を評価してみてください、そしてそれはうまくいくはずです...

var json = eval("("+data[0]+");");

また、eval()を直接呼び出す代わりに、提供されているJSON.parse() here を使用することをお勧めします。

0
Josh Stodola

配列ボックスを使用しないでください。データを適切にフォーマットしてください。

{"account":{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}}
0

出力バッファーが空ではない可能性があるため、AJAX JSONに属さないバイトを受信します。

echoまたはob_clean()でjsonを出力する直前に、サーバー側でdie()を使用してバッファをクリーンアップしてください。 contentTypeを指定する必要はありません。デフォルト値が正しく機能すると思います。

私は同じ問題を抱えていてそれを解決しました。

お役に立てれば幸いです。

0
Elorfin

同様のエラーを受け取りました。少し時間をかけて調べました-PHP5.2以降、PHPが(ネイティブに)JSONをサポートしていないことはほとんどわかりませんでした。重要なお知らせ...

0

これも試して

$.ajax({
    url: url,
    data:datas,
    success:function(datas, textStatus, jqXHR){
    var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{')));
})};

私の場合、サーバーは「{」の前に不明な文字で応答します

0
valir

昨日は$。 Ajaxはまだ間違いはありません。今日は間違いを引用しています。昨日は、問題のparsererror jqueryバージョンと言います。私が使用しているのは、jquery-1.3.2.min.jsです。この版も終わりました、今日は打ち上げです。データソース:変更なし。理由がわからない?

0
郑州网建