jquery loop pada data Json menggunakan $ .each

160

Saya memiliki JSON berikut dikembalikan dalam data yang disebut variabel.

INI ADALAH JSON YANG MENDAPATKAN ...

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

dan saya mencoba untuk mengulang koleksi menggunakan $ .each tapi saya mengalami masalah di mana peringatan menunjukkan tidak terdefinisi. Saya telah mencoba banyak sintaks yang berbeda tetapi sepertinya tidak bisa memahaminya.

JQuery yang saya gunakan adalah

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

Adakah yang bisa mengarahkan saya ke arah yang benar?

EDIT Ini adalah kode yang saya gunakan untuk mengambil data

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

dan ini adalah fungsi yang dipanggil saat dipanggil kembali

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

EDIT 2 Ini agak membingungkan saya, menurut dokumen itu harus berfungsi seperti yang saya miliki, tetapi tidak. Menurut fiddler tajuknya menunjukkan: -

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

dan JSON tepat di atas. Saya menggunakan chrome jika ini berbeda. Akan menguji di IE dan FF ....

EDIT 3

menggunakan $. dapatkan hasil

"[\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]"
Rippo
sumber
Ini bekerja untuk saya. Pastikan data dikirimkan dengan benar ke setiap metode.
kgiannakakis

Jawaban:

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);
});

dua opsi ini berfungsi dengan baik, kecuali jika Anda memiliki sesuatu seperti:

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:

coba dengan ini dan jelaskan apa hasilnya

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

UNTUK EDIT 3:

ini memperbaiki masalah, tetapi bukan gagasan untuk menggunakan "eval", Anda harus melihat bagaimana tanggapan di '/ Cms / GetPages / 123'.

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});
andres descalzo
sumber
1
Sepertinya saya perlu menambahkaneval(data)
Rippo
dalam fungsi "httpData" di jQuery Anda dapat melihat jendela bernama ["eval"] untuk data json. Anda tidak perlu menggunakan eval. baris ini "$. get ('/ Cms / GetPages / 123'" adalah untuk menunjukkan kepada Anda yang menerima di "data".
andres descalzo
Miliki jawaban yang diperbarui (lihat EDIT 3) untuk menunjukkan apa yang $.getmenghasilkan
Rippo
bagaimana Anda mengembalikan data dalam "/ Cms / GetPages / 123"?
andres descalzo
17

Sudahkah Anda mengonversi data dari string ke objek JavaScript?

Anda dapat melakukannya dengan data = eval('(' + string_data + ')'); atau, yang lebih aman, data = JSON.parse(string_data);tetapi nantinya hanya akan berfungsi di FF 3.5 atau jika Anda memasukkan json2.js

jQuery sejak 1.4.1 juga memiliki fungsi untuk itu $.parseJSON(),.

Tetapi sebenarnya, $.getJSON()harus memberi Anda objek json yang sudah diurai, jadi Anda harus memeriksa semuanya dengan teliti, ada sedikit kesalahan yang terkubur di suatu tempat, seperti Anda mungkin lupa mengutip sesuatu di json, atau salah satu tanda kurung tidak ada.

vava
sumber
Sepertinya saya perlu menambahkanfillselect(eval(data));
Rippo
BTW seberapa kompatibel eval?
Rippo
3
Itu seharusnya data = eval('('+string_data+')');. Juga, jQuery memiliki fungsi laindata = jQuery.parseJSON(string_data);
Greg
Ada sesuatu yang tidak beres. hanya eval(data)bekerja. Silakan lihat EDIT 2 saya
Rippo
2
Saya telah melihat jQuery.parseJSON (string_data) gagal dalam kasus tertentu, di mana data = eval ('(' + string_data + ')') berfungsi dengan baik.
Dominik Ras
5

getJSON akan mengevaluasi data untuk JSON untuk Anda, asalkan tipe konten yang benar digunakan. Pastikan server mengembalikan data sebagai aplikasi / json.

kgiannakakis
sumber
1
menurut fiddler jenis kontennya adalahContent-Type: application/json; charset=utf-8
Rippo
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Rolando Gonzales Medina
sumber