Цикл jquery для данных Json с использованием $ .each

160

У меня есть следующий JSON, возвращенный в переменной с именем data.

ЭТО 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 Это немного смущает меня, в соответствии с документами, он должен работать, как у меня, но это не так. Согласно 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]"
Rippo
источник
Меня устраивает. Убедитесь, что данные передаются правильно каждому методу.
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)
Rippo
в функции "httpData" в jQuery вы можете увидеть вызываемое окно ["eval"] для данных json. Вам не нужно использовать Eval. эта строка «$. get ('/ Cms / GetPages / 123'» ​​предназначена для того, чтобы показать вам, что получают данные в «data».
andres descalzo
Обновленный ответ (см. РЕДАКТИРОВАТЬ 3), чтобы показать, что $.getпроизводит
Rippo
как вы возвращаете данные в "/ 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
Кстати, насколько совместим 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 + ')') работает просто отлично.
Доминик Рас,
5

getJSON будет оценивать данные в JSON для вас, если используется правильный тип содержимого. Убедитесь, что сервер возвращает данные как application / json.

kgiannakakis
источник
1
по словам скрипача, тип контентаContent-Type: application/json; charset=utf-8
Rippo
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Роландо Гонсалес Медина
источник