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]"

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

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.


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.


1
według Content-Type: application/json; charset=utf-8
Fiddlera

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.