jquery loop en datos Json usando $ .each

160

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 encuentro con problemas en los que la alerta se muestra indefinida. He probado muchas sintaxis diferentes, pero parece que no puedo entender esto.

El JQuery que estoy usando es

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

¿Alguien puede señalarme en la dirección correcta?

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

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

y esta es la función que se llama al devolver 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 lo hace. Según el violinista, el encabezado muestra: -

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

y el JSON es exactamente correcto arriba. Estoy usando Chrome si esto hace algo diferente. Se probará en IE y FF ...

EDITAR 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]"
Rippo
fuente
Esto funciona para mi. Asegúrese de que los datos se pasen correctamente a cada método.
kgiannakakis

Respuestas:

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

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 EDITAR 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);
  });
});
andres descalzo
fuente
1
Parece que necesitaba agregareval(data)
Rippo
en la función "httpData" en jQuery puede ver una ventana llamada ["eval"] para los datos json. no necesitas usar eval. esta línea "$. get ('/ Cms / GetPages / 123'" es para mostrarle que está recibiendo "datos".
andres descalzo
Han actualizado la respuesta (ver EDITAR 3) para mostrar lo que $.getproduce
Rippo
¿Cómo devuelve los datos en "/ Cms / GetPages / 123"?
andres descalzo
17

¿Has convertido tus datos de cadena a objeto de JavaScript?

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

jQuery 1.4.1 ya que también tiene la función de que, $.parseJSON().

Pero en realidad, $.getJSON() debería darle un objeto json ya analizado, por lo que debe verificar todo a fondo, hay un pequeño error enterrado en alguna parte, como puede haber olvidado citar algo en json, o falta uno de los corchetes.

vava
fuente
Parece que necesito agregarfillselect(eval(data));
Rippo
Por cierto, ¿qué tan compatible es eval?
Rippo
3
Eso debería ser data = eval('('+string_data+')');. Además, jQuery tiene otra funcióndata = jQuery.parseJSON(string_data);
Greg
Hay algo que no está del todo bien. Solo eval(data)funciona. Por favor vea mi EDIT 2
Rippo
2
He visto que jQuery.parseJSON (string_data) falla en ciertos casos, donde data = eval ('(' + string_data + ')') funciona bien.
Dominik Ras
5

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

kgiannakakis
fuente
1
según el violinista, el tipo de contenido esContent-Type: application/json; charset=utf-8
Rippo
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Rolando Gonzales Medina
fuente