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

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

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.


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.


1
de acordo com o violinista, o tipo de conteúdo éContent-Type: application/json; charset=utf-8
Rippo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.