loop jquery nos dados Json usando $ .each

160

Eu tenho o seguinte JSON retornado em uma variável chamada data.

ESTE É O JSON QUE É DEVOLVIDO ...

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

e estou tentando fazer um loop pela coleção usando $ .each, mas estou com problemas nos quais o alerta está sendo mostrado indefinido. Eu tentei muitas sintaxes diferentes, mas não consigo entender isso.

O JQuery que estou usando é

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

Alguém pode me apontar na direção certa?

EDIT Este é o código que estou usando para capturar os dados

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

e esta é a função que é chamada ao retornar a chamada

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

EDIT 2 Isso está me confundindo um pouco, de acordo com os documentos que devem funcionar como eu tenho, mas não. De acordo com o violinista, o cabeçalho mostra: -

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

e o JSON está exatamente correto acima. Estou usando o chrome se isso faz alguma diferença. Irá testar no IE e FF ....

EDIT 3

usando $ .get produz

"[\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
fonte
Funciona para mim. Verifique se os dados foram passados ​​corretamente para cada método.
kgiannakakis

Respostas:

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

essas duas opções funcionam bem, a menos que você tenha 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:

tente com isso e descreve qual é o resultado

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

PARA A EDIÇÃO 3:

isso corrige o problema, mas não a idéia de usar "eval", você deve ver como está a resposta em '/ Cms / GetPages / 123'.

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});
andres descalzo
fonte
1
Parece que eu precisava para adicionareval(data)
Rippo
na função "httpData" no jQuery, você pode ver uma janela chamada ["eval"] para os dados do json. você não precisa usar eval. esta linha "$. get ('/ Cms / GetPages / 123'" é para mostrar a você que está recebendo "dados".
andres descalzo
Tem resposta atualizada (ver EDIT 3) para mostrar o que $.getproduz
Rippo
como você está retornando os dados em "/ Cms / GetPages / 123"?
andres descalzo
17

Você converteu seus dados de string para objeto JavaScript?

Você pode fazê-lo com data = eval('(' + string_data + ')'); ou, o que é mais seguro, data = JSON.parse(string_data);mas posteriormente só funcionará no FF 3.5 ou se você incluir o json2.js

O jQuery desde a versão 1.4.1 também tem função para isso $.parseJSON(),.

Mas, na verdade, $.getJSON()você deve fornecer o objeto json já analisado; portanto, verifique tudo minuciosamente, pois há pouco erro oculto em algum lugar, como se você tivesse esquecido de citar algo em json ou se faltar um dos colchetes.

vava
fonte
Parece que preciso adicionarfillselect(eval(data));
Rippo
BTW quão compatível é eval?
Rippo
3
Isso deveria ser data = eval('('+string_data+')');. Além disso, o jQuery tem outra funçãodata = jQuery.parseJSON(string_data);
Greg
Há algo não muito certo. só eval(data)funciona. Por favor, veja o meu EDIT 2
Rippo
2
Eu vi jQuery.parseJSON (string_data) falhar em certos casos, onde data = eval ('(' + string_data + ')') funciona muito bem.
Dominik Ras
5

O getJSON avaliará os dados para JSON para você, desde que o tipo de conteúdo correto seja usado. Verifique se o servidor está retornando os dados como application / json.

kgiannakakis
fonte
1
de acordo com o violinista, o tipo de conteúdo éContent-Type: application/json; charset=utf-8
Rippo
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Rolando Gonzales Medina
fonte