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

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

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.


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.


1
selon Content-Type: application/json; charset=utf-8
Fiddler, le

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.