15

JQuery getJSON と ajax の両方を使用して、次の json 応答を解析しようとしました。

[{"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 経由でこのデータを取得できるようにする何かを見落としている可能性があることを願っています。誰にもアイデアはありますか?

4

17 に答える 17

7

あなたが持っている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" 
});

そして、どちらも私にとってはうまくいきました。

于 2009-03-10T18:46:47.483 に答える
3

まだ誰かがこれに問題を抱えている場合は、応答が JSON 文字列とコンテンツ タイプ "application/json" である必要があるためです。

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

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

h番目、

マティ

于 2010-03-17T18:43:14.813 に答える
1

HTML(つまり、&lt; H1&gt;)をXMLエンコードしてみましたか?

于 2009-03-10T17:32:23.387 に答える
1

テキストとして返してから、json.orgパーサー
で解析して、 動作が異なるかどうかを確認できます。

于 2009-03-10T17:36:04.517 に答える
1

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

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

読むべき

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

これも大きな違いです。

于 2009-11-24T20:49:45.957 に答える
1

これは実用的な例であり、テストされています!

<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}]
于 2012-07-23T17:32:02.020 に答える
1

Firebug Lite を無効にすると、この問題が解決しました。

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

于 2011-01-29T07:03:33.050 に答える
0

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

INCORRECT(parsererror)

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

正しい

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

ブラウザ:IE7 / IE8

于 2011-12-21T12:52:17.193 に答える
0

これも試してください

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

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

于 2012-04-06T12:37:37.683 に答える
0

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

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

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

于 2009-03-10T18:11:49.097 に答える
0

あなたは間違った質問をしていると思います。$.getJSON() を使用する方がはるかに簡単で、問題が発生した場合は、$.ajax() よりも $.getJSON() を要求する方がよいでしょう。また、getJSON 関数のソース コードを調べると役に立つかもしれません。そうではありません。

于 2009-03-10T18:07:20.260 に答える
0

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

于 2010-12-22T03:59:25.683 に答える
0

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

于 2010-05-24T04:24:40.877 に答える
0

まず、問題が一般的な JSON エンコーディング/デコーディングにあるかどうかを特定してみてください。数字と単純な文字列を使った単純なオブジェクトを試してから、引用符で囲んだ HTML を使ってみましょう。

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

于 2009-03-10T17:57:45.980 に答える
0

おそらく出力バッファが空ではないため、AJAX は JSON に属さないバイトを受け取ります。

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

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

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

于 2011-05-10T09:28:37.783 に答える