loop jquery su dati Json usando $ .each


160

Ho il seguente JSON restituito in una variabile chiamata data.

QUESTO È IL JSON CHE VIENE RESTITUITO ...

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

e sto cercando di scorrere la raccolta usando $ .each ma sto riscontrando problemi in cui l'avviso viene visualizzato indefinito. Ho provato molte diverse sintassi ma non riesco a capirlo.

Il JQuery che sto usando è

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

Qualcuno può indicarmi la giusta direzione?

EDIT Questo è il codice che sto usando per afferrare i dati

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

e questa è la funzione che viene richiamata al momento della richiamata

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

EDIT 2 Questo mi sta confondendo leggermente, secondo i documenti dovrebbe funzionare come lo ho io, ma non lo fa. Secondo il violinista l'intestazione mostra: -

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

e JSON è esattamente corretto sopra. Sto usando Chrome se questo rende diverso. Testerà in IE e FF ....

MODIFICA 3

usando $ .get si 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]"

Per me funziona. Assicurarsi che i dati vengano passati correttamente a ciascun metodo.
kgiannakakis,

Risposte:


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

queste due opzioni funzionano bene, a meno che tu non abbia qualcosa di simile:

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

MODIFICARE:

prova con questo e descrive quale sia il risultato

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

PER EDIT 3:

questo risolve il problema, ma non l'idea di usare "eval", dovresti vedere come sono le risposte in '/ Cms / GetPages / 123'.

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

1
Sembra che dovessi aggiungereeval(data)
Rippo, il

nella funzione "httpData" in jQuery puoi vedere una finestra chiamata ["eval"] per i dati json. non è necessario utilizzare eval. questa riga "$. get ('/ Cms / GetPages / 123'" indica che stai ricevendo "dati".
andres descalzo,


Hai una risposta aggiornata (vedi EDIT 3) per mostrare cosa $.getproduce
Rippo,

come stai restituendo i dati in "/ Cms / GetPages / 123"?
andres descalzo,

17

Hai convertito i tuoi dati da stringa a oggetto JavaScript?

Puoi farlo con data = eval('(' + string_data + ')'); o, che è più sicuro, data = JSON.parse(string_data);ma in seguito funzionerà solo in FF 3.5 o se includi json2.js

jQuery 1.4.1 in quanto hanno anche la funzione per questo, $.parseJSON().

Ma in realtà, $.getJSON()dovresti darti un oggetto json già analizzato, quindi dovresti semplicemente controllare tutto a fondo, c'è qualche piccolo errore sepolto da qualche parte, come potresti aver dimenticato di citare qualcosa in JSON, o manca una delle parentesi.


Sembra che debba aggiungerefillselect(eval(data));
Rippo, il

A proposito quanto è compatibile eval?
Rippo,

3
Questo dovrebbe essere data = eval('('+string_data+')');. Inoltre, jQuery ha un'altra funzionedata = jQuery.parseJSON(string_data);
Greg,

C'è qualcosa che non va bene. eval(data)funziona solo . Si prega di consultare il mio EDIT 2
Rippo il

2
Ho visto jQuery.parseJSON (string_data) fallire in alcuni casi, dove data = eval ('(' + string_data + ')') funziona bene.
Dominik Ras,

5

getJSON valuterà i dati su JSON per te, purché venga utilizzato il tipo di contenuto corretto. Assicurarsi che il server stia restituendo i dati come application / json.


1
secondo il violinista il tipo di contenuto èContent-Type: application/json; charset=utf-8
Rippo il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.