jquery loop en datos Json usando $ .each

Tengo el siguiente JSON devuelto en una variable llamada datos.

ESTE ES EL JSON QUE SE DEVUELVE …

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

y estoy tratando de recorrer la colección usando $ .each, pero me estoy encontrando con problemas donde la alerta se muestra indefinida. He intentado mucha syntax diferente pero parece que no puedo resolver esto.

El JQuery que estoy usando es

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

¿Puede alguien señalarme en la dirección correcta?

EDITAR Este es el código que estoy usando para captar los datos

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

y esta es la función a la que se recurre cuando se devuelve la llamada

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

EDITAR 2 Esto me confunde un poco, de acuerdo con los documentos debería funcionar como lo tengo, pero no es así. Según el violinista, el encabezado muestra:

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

y el JSON es exactamente correcto más arriba. Estoy usando Chrome si esto hace que sea diferente. Probará en IE y FF ….

EDIT 3

usando $ .get produce

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

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

estas dos opciones funcionan bien, a menos que tenga algo como:

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

EDITAR:

prueba con esto y describe cuál es el resultado

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

PARA EDIT 3:

esto corrige el problema, pero no la idea de usar “eval”, debería ver cómo está la respuesta en ‘/ Cms / GetPages / 123’.

 $.get('/Cms/GetPages/123', function(data) { $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) { alert(item.PageName); });​ }); 

¿Ha convertido sus datos de cadena a objeto JavaScript?

Puedes hacerlo con data = eval('(' + string_data + ')'); o, lo que es más seguro, data = JSON.parse(string_data); pero luego solo funcionará en FF 3.5 o si incluye json2.js

jQuery desde 1.4.1 también tiene función para eso, $.parseJSON() .

Pero, en realidad, $.getJSON() debería darle un objeto json ya analizado, por lo que debería verificarlo completamente, hay un pequeño error oculto en algún lugar, como que se haya olvidado de citar algo en json, o falta uno de los corchetes.

getJSON evaluará los datos a JSON por usted, siempre que se use el tipo de contenido correcto. Asegúrese de que el servidor devuelve los datos como application / json.