web-dev-qa-db-ja.com

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

次のJSONをdataという変数で返しました。

このIS返されるJSON ...

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

私は$ .eachを使用してコレクションをループしようとしていますが、アラートが未定義であるという問題に遭遇しています。さまざまな構文を試してみましたが、理解できないようです。

私が使っているJQueryは

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

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

EDITこれは、データを取得するために使用しているコードです。

$.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]"
152
Rippo
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つの選択肢がない限り、これら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);
  });​
});
282
andres descalzo

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

data = eval('(' + string_data + ')');またはより安全なdata = JSON.parse(string_data);でそれを行うことができますが、それ以降はFF 3.5または json2.js を含める場合にのみ機能します。

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

しかし実際には、$.getJSON()はすでに解析済みのjsonオブジェクトを提供するはずです。したがって、すべてを徹底的にチェックする必要があります。

16
vava

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

4
kgiannakakis
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});