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

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

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.


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.


1
según el violinista, el tipo de contenido esContent-Type: application/json; charset=utf-8
Rippo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.