boucle jquery sur les données Json en utilisant $ .each

160

J'ai le JSON suivant retourné dans une variable appelée data.

CECI EST LE JSON QUI EST RETOURNÉ ...

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

et j'essaye de parcourir la collection en utilisant $ .each mais je rencontre des problèmes où l'alerte est indéfinie. J'ai essayé beaucoup de syntaxes différentes mais je n'arrive pas à comprendre cela.

Le JQuery que j'utilise est

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

Est-ce que quelqu'un peut-il me montrer la bonne direction?

EDIT C'est le code que j'utilise pour récupérer les données

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

et c'est la fonction qui est appelée lors du rappel

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

EDIT 2 Cela me déroute un peu, selon la documentation, cela devrait fonctionner comme je l'ai, mais ce n'est pas le cas. Selon Fiddler, l'en-tête montre: -

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

et le JSON est exactement correct ci-dessus. J'utilise chrome si cela en fait différent. Testera dans IE et FF ....

MODIFIER 3

l'utilisation de $ .get produit

"[\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
la source
Ça marche pour moi. Assurez-vous que les données sont correctement transmises à chaque méthode.
kgiannakakis

Réponses:

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

ces deux options fonctionnent bien, sauf si vous avez quelque chose comme:

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

ÉDITER:

essayez avec ceci et décrit ce que le résultat

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

POUR EDIT 3:

cela corrige le problème, mais pas l'idée d'utiliser "eval", vous devriez voir comment sont les réponses dans '/ Cms / GetPages / 123'.

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});
andres descalzo
la source
1
Il semble que je devais ajoutereval(data)
Rippo
dans la fonction "httpData" de jQuery, vous pouvez voir une fenêtre appelée ["eval"] pour les données json. vous n'avez pas besoin d'utiliser eval. cette ligne "$. get ('/ Cms / GetPages / 123'" est pour vous montrer que vous recevez dans "data".
andres descalzo
Ont mis à jour la réponse (voir EDIT 3) pour montrer ce qui $.getproduit
Rippo
comment renvoyez-vous les données dans "/ Cms / GetPages / 123"?
andres descalzo
17

Avez-vous converti vos données de chaîne en objet JavaScript?

Vous pouvez le faire avec data = eval('(' + string_data + ')'); ou, ce qui est plus sûr, data = JSON.parse(string_data);mais plus tard ne fonctionnera que dans FF 3.5 ou si vous incluez json2.js

jQuery depuis 1.4.1 ont également la fonction pour cela, $.parseJSON().

Mais en fait, cela $.getJSON()devrait vous donner un objet json déjà analysé, donc vous devriez juste tout vérifier minutieusement, il y a une petite erreur enterrée quelque part, comme si vous avez oublié de citer quelque chose dans json, ou l'un des crochets est manquant.

vava
la source
On dirait que j'ai besoin d'ajouterfillselect(eval(data));
Rippo
BTW est-il compatible eval?
Rippo
3
Cela devrait être data = eval('('+string_data+')');. En outre, jQuery a une autre fonctiondata = jQuery.parseJSON(string_data);
Greg
Il y a quelque chose qui ne va pas. eval(data)fonctionne seulement . S'il vous plaît voir mon EDIT 2
Rippo
2
J'ai vu jQuery.parseJSON (string_data) échouer dans certains cas, où data = eval ('(' + string_data + ')') fonctionne très bien.
Dominik Ras
5

getJSON évaluera les données en JSON pour vous, à condition que le type de contenu correct soit utilisé. Assurez-vous que le serveur renvoie les données sous forme d'application / json.

kgiannakakis
la source
1
selon Content-Type: application/json; charset=utf-8
Fiddler, le
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Rolando Gonzales Medina
la source