$ .eachを使用したjsonデータのjqueryループ


160

dataという変数に次のJSONが返されます。

これは返されるJSONです...

[ 
{"Id": 10004, "PageName": "club"}, 
{"Id": 10040, "PageName": "qaz"}, 
{"Id": 10059, "PageName": "jjjjjjj"}
]

$ .eachを使用してコレクションをループしようとしていますが、アラートが未定義と表示されている問題が発生しています。私は多くの異なる構文を試しましたが、これを理解できないようです。

私が使用しているjQueryは

$.each(data, function(i, item) {
    alert(item.PageName);
});

誰かが私を正しい方向に向けることができますか?

編集 これは私がデータを取得するために使用しているコードです

$.getJSON('/Cms/GetPages/123', null, function(data) {
  fillSelect(data);
});

これはコールバック時に呼び出される関数です

function fillSelect(data) {
  alert(data);
  $.each(data, function(i, item) {
    alert(item.PageName);
  });
}

編集2 これは私をわずかに混乱させます、ドキュメントによると、それは私が持っているように機能するはずですが、そうではありません。フィドラーによると、ヘッダーは示しています:-

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

上記のJSONは正確です。これが異なる場合は、クロムを使用しています。IEとFFでテストします。

編集3

$ .getを使用すると、

"[\r\n {\r\n \"Id\": 10041,\r\n \"PageName\": \"01234567890\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n },\r\n {\r\n \"Id\": 10001,\r\n \"PageName\": \"about\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 1\r\n },\r\n {\r\n \"Id\": 10056,\r\n \"PageName\": \"fdgdfgdfg\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 1\r\n },\r\n {\r\n \"Id\": 10052,\r\n \"PageName\": \"hjkhjk\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n },\r\n {\r\n \"Id\": 10059,\r\n \"PageName\": \"jjjjjjj\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 1\r\n },\r\n {\r\n \"Id\": 10057,\r\n \"PageName\": \"qqqqq\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n },\r\n {\r\n \"Id\": 10054,\r\n \"PageName\": \"qwqw\",\r\n \"MetaId\": 1000,\r\n \"TemplateId\": 2\r\n }\r\n]"

わたしにはできる。データが各メソッドに正しく渡されることを確認してください。
kgiannakakis 2010

回答:


303
var data = [ 
 {"Id": 10004, "PageName": "club"}, 
 {"Id": 10040, "PageName": "qaz"}, 
 {"Id": 10059, "PageName": "jjjjjjj"}
];

$.each(data, function(i, item) {
    alert(data[i].PageName);
});

$.each(data, function(i, item) {
    alert(item.PageName);
});

次のようなものがない限り、これらの2つのオプションはうまく機能します。

var data.result = [ 
 {"Id": 10004, "PageName": "club"}, 
 {"Id": 10040, "PageName": "qaz"}, 
 {"Id": 10059, "PageName": "jjjjjjj"}
];

$.each(data.result, function(i, item) {
    alert(data.result[i].PageName);
});

編集:

これを試して、結果を説明してください

$.get('/Cms/GetPages/123', function(data) {
  alert(data);
});

編集3の場合:

これは問題を修正しますが、「eval」を使用するという考えではありません。「/ Cms / GetPages / 123」で応答がどのように表示されるかを確認してください。

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});

1
私は追加する必要のように見えるeval(data)
Rippo

jQueryの関数 "httpData"で、jsonデータの呼び出されたwindow ["eval"]を確認できます。evalを使用する必要はありません。この行「$。get( '/ Cms / GetPages / 123'」は、「data」で受信していることを示しています
andres descalzo


回答を編集して(編集3を参照)、何が$.get生成されるかを示します
Rippo

「/ Cms / GetPages / 123」でデータをどのように返しますか?
andres descalzo 2010

17

データを文字列からJavaScriptオブジェクトに変換しましたか?

data = eval('(' + string_data + ')'); orを使用してそれを行うことができますが、これは安全ですdata = JSON.parse(string_data);が、後でFF 3.5でのみ機能するか、json2.jsを含める場合にのみ機能します

1.4.1以降のjQueryにもその機能があり$.parseJSON()ます。

しかし、実際に$.getJSON()は、すでにパースされているjsonオブジェクトを提供する必要があるため、すべてを完全にチェックする必要があります。jsonで何かを引用するのを忘れたか、ブラケットの1つが欠落しているなど、どこかに埋められている間違いはほとんどありません。


追加する必要があるようですfillselect(eval(data));
Rippo '26 / 02/26

ところで、どのように互換性がありevalますか?
Rippo

3
それはあるはずですdata = eval('('+string_data+')');。また、jQueryには別の機能がありますdata = jQuery.parseJSON(string_data);
Greg

何かがおかしいです。のみeval(data)機能します。私の編集2をご覧ください
Rippo

2
jQuery.parseJSON(string_data)が特定のインスタンスで失敗するのを見てきました。data= eval( '(' + string_data + ')')は問題なく動作します。
ドミニクラス2014

5

getJSONは、正しいcontent-typeが使用されている限り、データをJSONに評価します。サーバーがデータをapplication / jsonとして返していることを確認してください。


1
フィドラーによると、コンテンツタイプは次のContent-Type: application/json; charset=utf-8
とおり

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.