dataという変数に次のようなJSONを返しています。
これが返されるJsonです...。
[
{"Id": 10004, "PageName": "club"},
{"Id": 10040, "PageName": "qaz"},
{"Id": 10059, "PageName": "jjjjjjj"}
]
で、$.eachを使ってコレクションをループさせようとしているのですが、alertがundefinedを表示するという問題に直面しています。いろいろな構文を試してみましたが、なかなか解決しません。
私が使用している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。 これは私を少し混乱させています。ドキュメントによると、私が持っているように動作するはずですが、そうではありません。fiddlerによると、ヘッダは次のようになっています。
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]"
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);
});
EDIT:
これで試してみて、その結果を説明します。
$.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);
});
});
データを文字列からJavaScriptのオブジェクトに変換しましたか?
これは、data = eval('(' + string_data + ')');
または、data = JSON.parse(string_data);
でできますが、これは、FF 3.5か、json2.jsをインクルードしている場合にしか動作しません。
1.4.1以降のjQueryにも、$.parseJSON()
という関数があります。
しかし、実際には、$.getJSON()
は、すでにパースされたjsonオブジェクトを与えてくれるはずなので、すべてを徹底的にチェックすべきです。どこかに小さなミスが埋もれているかもしれません。例えば、jsonの中で何かを引用するのを忘れているかもしれませんし、どちらかのブラケットが欠けているかもしれません。