цикл jquery на даних Json за допомогою $ .each


160

У мене є наступний 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);
  });
}

EDIT 2 Це мене трохи бентежить, згідно з документами, він повинен працювати так, як у мене є, але це не так. За словами фіддлера, заголовок показує:

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

і JSON точно правильний вище. Я використовую хром, якщо це робить щось іншим. Буде тестуватися в IE та FF ....

EDIT 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

Відповіді:


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

ці два варіанти працюють добре, якщо у вас є щось на кшталт:

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)
Ріппо,

у функції "httpData" в jQuery можна побачити викликане вікно ["eval"] для даних json. вам не потрібно використовувати eval. цей рядок "$. get ('/ Cms / GetPages / 123'" означає показати вам, що отримуєте "дані".
andres descalzo



як ви повертаєте дані у "/ Cms / GetPages / 123"?
andres descalzo

17

Ви перетворили свої дані з рядка в об’єкт JavaScript?

Ви можете зробити це за допомогою data = eval('(' + string_data + ')'); або, що є більш безпечним, data = JSON.parse(string_data);але пізніше це буде працювати лише у FF 3.5 або якщо ви включите json2.js

JQuery оскільки 1.4.1 також має функцію для цього $.parseJSON().

Але насправді $.getJSON()слід дати вам вже проаналізований об’єкт json, тому вам слід просто все ретельно перевірити, десь невелика помилка, похована десь, як ви, можливо, забули щось цитувати в json, або один з дужок відсутній.


Схоже, мені потрібно додатиfillselect(eval(data));
Rippo

BTW наскільки сумісний eval?
Ріппо

3
Так і має бути data = eval('('+string_data+')');. Також jQuery має ще одну функціюdata = jQuery.parseJSON(string_data);
Грег

Є щось не зовсім правильно. eval(data)працює лише . Будь ласка, дивіться мою
редакцію

2
Я бачив, що jQuery.parseJSON (string_data) провалюється в певних випадках, коли data = eval ('(' + string_data + ')') працює чудово.
Домінік Рас

5

getJSON оцінить дані для JSON для вас, якщо використовується правильний тип вмісту. Переконайтеся, що сервер повертає дані як application / json.


1
За словами Content-Type: application/json; charset=utf-8
фіддлера,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.