2010-02-26 25 views
142

Tengo el siguiente JSON devuelto en una variable llamada datos.

Este es el JSON que obtiene DEVUELTO ...

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

y yo estoy tratando de recorrer la colección usando $ .Cada pero estoy funcionando en problemas en los que la alerta está mostrando indefinido. He intentado mucha sintaxis diferente pero parece que no puedo resolver esto.

El jQuery que estoy usando es

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

¿Puede cualquiera que me señale en la dirección correcta?

EDITAR Este es el código que estoy utilizando para agarrar los datos

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

y esta es la función que es llamada a llamada de vuelta

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

EDIT 2 Este me confunde un poco, de acuerdo con los documentos debería funcionar como lo tengo, pero no es así. De acuerdo con Fiddler la cabecera muestra: -

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

y el JSON es exactamente correcto arriba. Estoy usando Chrome si esto hace que sea diferente. Pondrá a prueba en IE y FF ....

EDITAR 3

usando $ .get produce

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

Funciona para mí. Asegúrese de que los datos se pasen correctamente a cada método. – kgiannakakis

Respuesta

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

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:

tratar con esto y describe lo que el resultado

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

PARA EDITAR 3:

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

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

Parece que necesitaba agregar 'eval (datos)' – Rippo

+0

en la función "httpData" en jQuery puede ver una ventana llamada ["eval"] para los datos json. no necesita usar eval. esta línea "$. get ('/ Cms/GetPages/123'" es para mostrarle que está recibiendo en "datos". –

+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

¿Ha convertido sus datos de cadena a objeto JavaScript?

Usted puede hacerlo con data = eval('(' + string_data + ')'); o, lo que es más seguro, pero más tarde data = JSON.parse(string_data); sólo se trabaja en FF 3.5 o si incluye json2.js

jQuery 1.4.1, ya que también tienen la función para la que, $.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 enterrado en algún lugar, como haber olvidado citar algo en json, o falta uno de los corchetes.

+0

Parece que necesito agregar 'fillselect (eval (data));' – Rippo

+0

BTW ¿Qué tan compatible es 'eval'? – Rippo

+3

Eso debería ser 'data = eval ('(' + string_data + ')');'. Además, jQuery tiene otra función 'data = jQuery.parseJSON (string_data);' – Greg

4

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

+1

según el violinista, el tipo de contenido es 'Content-Type: application/json; charset = utf-8' – Rippo