jquery na danych Json przy użyciu $ .each

160

Mam następujący kod JSON zwrócony w zmiennej o nazwie data.

TO JEST ZWRACANY JSON ...

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

i próbuję przeglądać kolekcję przy użyciu $ .each, ale napotykam problemy, w których alert jest niezdefiniowany. Próbowałem wielu różnych składni, ale nie mogę tego rozgryźć.

JQuery, którego używam, to

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

Czy ktoś może wskazać mi właściwy kierunek?

EDYCJA To jest kod, którego używam do pobierania danych

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

i jest to funkcja wywoływana po oddzwonieniu

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

EDYCJA 2 To jest trochę mylące, zgodnie z dokumentacją powinno działać tak, jak mam, ale tak nie jest. Według skrzypka nagłówek pokazuje: -

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

a JSON jest dokładnie poprawny powyżej. Używam chromu, jeśli to robi coś innego. Będzie testować w IE i FF ....

EDYCJA 3

używając $ .get produkuje

"[\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
źródło
Mi to pasuje. Upewnij się, że dane są poprawnie przekazywane do każdej metody.
kgiannakakis

Odpowiedzi:

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

te dwie opcje działają dobrze, chyba że masz coś takiego:

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

EDYTOWAĆ:

spróbuj z tym i opisz, jaki jest wynik

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

DLA EDYCJI 3:

to rozwiązuje problem, ale nie pomysł użycia „eval”, powinieneś zobaczyć, jaka jest odpowiedź w '/ Cms / GetPages / 123'.

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});
andres descalzo
źródło
1
Wygląda na to, że muszę dodaćeval(data)
Rippo
w funkcji „httpData” w jQuery można zobaczyć wywołane okno [„eval”] dla danych json. nie musisz używać eval. ta linia "$. get ('/ Cms / GetPages / 123'" ma pokazać, że są odbierane w "danych".
andres descalzo
Zaktualizowałem odpowiedź (patrz EDYCJA 3), aby pokazać, co $.getprodukuje
Rippo
w jaki sposób zwracasz dane w „/ Cms / GetPages / 123”?
andres descalzo
17

Czy przekonwertowałeś dane z ciągu znaków na obiekt JavaScript?

Możesz to zrobić za pomocą data = eval('(' + string_data + ')'); lub, co jest bezpieczniejsze, data = JSON.parse(string_data);ale później będzie działać tylko w FF 3.5 lub jeśli dołączysz json2.js

jQuery 1.4.1 ponieważ mają również funkcję, że $.parseJSON().

Ale tak naprawdę, $.getJSON()powinieneś dać ci już przeanalizowany obiekt json, więc powinieneś po prostu dokładnie sprawdzić wszystko, gdzieś jest mały błąd, jakbyś zapomniał zacytować coś w json lub brakuje jednego z nawiasów.

vava
źródło
Wygląda na to, że muszę dodaćfillselect(eval(data));
Rippo
BTW, jak kompatybilny jest eval?
Rippo
3
Tak powinno być data = eval('('+string_data+')');. Ponadto jQuery ma inną funkcjędata = jQuery.parseJSON(string_data);
Greg
Coś jest nie tak. eval(data)działa tylko . Proszę zobaczyć mój EDIT 2
Rippo
2
Widziałem, jak jQuery.parseJSON (string_data) zawodzi w niektórych przypadkach, gdzie data = eval ('(' + string_data + ')') działa dobrze.
Dominik Ras
5

getJSON oceni dane do formatu JSON za Ciebie, o ile zostanie użyty prawidłowy typ zawartości. Upewnij się, że serwer zwraca dane jako application / json.

kgiannakakis
źródło
1
według Content-Type: application/json; charset=utf-8
Fiddlera
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Rolando Gonzales Medina
źródło