2010-02-26 18 views
142

Mam następujące JSON zwrócone w zmiennej o nazwie dane.

TO JEST JSON, który zostanie zwrócony ...

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

i próbuję pętli kolekcji za pomocą $ .each ale używam do problemu gdzie alert pokazuje niezdefiniowany. Próbowałem wielu różnych składni, ale nie mogę tego zrozumieć.

jQuery Używam jest

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

Może ktoś mi punkt w dobrym kierunku?

EDIT Jest to kod używam aby pobrać dane

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

i jest to funkcja, która zostanie wezwany oddzwonienie

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

EDIT 2 ten trochę mnie myli, według dokumentów powinien działać tak jak ja, 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 chrome, jeśli robi to inaczej. Przetestuje w IE i FF ....

EDIT 3

użyciu $ .get produkuje

"[\r\n {\r\n \"Id\": 10041,\r\n \"PageName\": \"\",\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]" 
+0

To działa dla mnie. Upewnij się, że dane są poprawnie przekazywane do każdej metody. – kgiannakakis

Odpowiedz

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

EDIT:

spróbować z tym i opisuje, co wynika

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

DLA EDIT 3:

to rozwiązuje problem, ale nie na pomysł, aby użyć "eval", trzeba zobaczyć, jak to 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 potrzebowałem dodać 'eval (dane)' – Rippo

+0

w funkcji "httpData" w jQuery można zobaczyć wywołane okno ["eval"] dla danych json. nie musisz używać eval. w tym wierszu "$. get" ("/ Cms/GetPages/123" "ma pokazywać, że odbierają dane". " –

+0

http://james.padolsey.com/jquery/#v=1.3.2&fn=jQuery. ajax http://james.padolsey.com/jquery/#v=1.3.2&fn=jQuery.httpData –

15

Czy dokonałeś konwersji danych z łańcucha znaków na obiekt JavaScript?

Można to zrobić z data = eval('(' + string_data + ')'); lub, który jest bezpieczniejszy, data = JSON.parse(string_data); ale później działa tylko w FF 3.5 lub jeśli zawierają json2.js

jQuery od 1.4.1 posiada również funkcję, że $.parseJSON().

Ale faktycznie, $.getJSON() powinien dać już sparsowany obiekt json, więc powinieneś po prostu sprawdzić wszystko dokładnie, gdzieś jest gdzieś pogmatwany błąd, jakbyś zapomniał podać coś w jsonie lub brakuje jednego z nawiasów.

+0

Wygląda na to, że muszę dodać 'fillselect (eval (dane));' – Rippo

+0

BTW jak kompatybilny jest "eval"? – Rippo

+3

To powinno być 'data = eval ('(' + string_data + ')');). Ponadto, jQuery ma inną funkcję 'data = jQuery.parseJSON (string_data);' – Greg

4

getJSON dokona oceny danych w JSON dla Ciebie, o ile użyto prawidłowego typu zawartości. Upewnij się, że serwer zwraca dane jako aplikacja/json.

+1

według typu fiddlera typem treści jest 'Content-Type: application/json; charset = utf-8' – Rippo