jquery-Schleife für Json-Daten mit $ .each

160

Ich habe den folgenden JSON in einer Variablen namens data zurückgegeben.

DAS IST DER JSON, DER ZURÜCKGEGEBEN WIRD ...

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

und ich versuche, die Sammlung mit $ .each zu durchlaufen, aber ich stoße auf Probleme, bei denen die Warnung undefiniert angezeigt wird. Ich habe viele verschiedene Syntaxen ausprobiert, kann dies aber nicht herausfinden.

Die JQuery, die ich verwende, ist

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

Kann mich jemand in die richtige Richtung weisen?

BEARBEITEN Dies ist der Code, mit dem ich die Daten abrufe

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

und dies ist die Funktion, die beim Rückruf aufgerufen wird

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

EDIT 2 Das ist etwas verwirrend für mich, laut den Dokumenten sollte es so funktionieren, wie ich es habe, aber es funktioniert nicht. Laut Fiddler zeigt der Header: -

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

und der JSON ist oben genau richtig. Ich benutze Chrom, wenn dies etwas anderes macht. Wird in IE und FF testen ....

BEARBEITEN 3

mit $ .get erzeugt

"[\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
quelle
Für mich geht das. Stellen Sie sicher, dass die Daten korrekt an jede Methode übergeben werden.
kgiannakakis

Antworten:

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

Diese beiden Optionen funktionieren gut, es sei denn, Sie haben etwas wie:

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

BEARBEITEN:

Versuchen Sie es damit und beschreiben Sie, was das Ergebnis ist

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

FÜR EDIT 3:

Dies behebt das Problem, aber nicht die Idee, "eval" zu verwenden. Sie sollten sehen, wie die Antwort in '/ Cms / GetPages / 123' ist.

$.get('/Cms/GetPages/123', function(data) {
  $.each(eval(data.replace(/[\r\n]/, "")), function(i, item) {
   alert(item.PageName);
  });
});
andres descalzo
quelle
1
Sieht so aus, als eval(data)
Rippo
In der Funktion "httpData" in jQuery sehen Sie ein aufgerufenes Fenster ["eval"] für die json-Daten. Sie müssen eval nicht verwenden. Diese Zeile "$. get ('/ Cms / GetPages / 123'" soll Ihnen zeigen, dass Sie in "Daten" empfangen.
andres descalzo
Habe die Antwort aktualisiert (siehe BEARBEITEN 3), um zu zeigen, was $.getproduziert
Rippo
Wie geben Sie die Daten in "/ Cms / GetPages / 123" zurück?
andres descalzo
17

Haben Sie Ihre Daten von einem String in ein JavaScript-Objekt konvertiert?

Sie können dies mit data = eval('(' + string_data + ')'); oder tun , was sicherer ist, data = JSON.parse(string_data);aber später nur in FF 3.5 oder mit json2.js funktioniert

jQuery seit 1.4.1 hat auch eine Funktion dafür , $.parseJSON().

Aber eigentlich $.getJSON()sollten Sie bereits analysierte JSON-Objekte erhalten, also sollten Sie einfach alles gründlich überprüfen, es ist irgendwo ein kleiner Fehler begraben, als hätten Sie vielleicht vergessen, etwas in JSON zu zitieren, oder eine der Klammern fehlt.

vava
quelle
Sieht so aus, als müsste ich hinzufügenfillselect(eval(data));
Rippo
Übrigens, wie kompatibel ist eval?
Rippo
3
Das sollte sein data = eval('('+string_data+')');. Außerdem hat jQuery eine andere Funktiondata = jQuery.parseJSON(string_data);
Greg
Da stimmt etwas nicht ganz. eval(data)funktioniert nur . Bitte sehen Sie meine EDIT 2
Rippo
2
Ich habe gesehen, dass jQuery.parseJSON (string_data) in bestimmten Fällen fehlschlägt, in denen data = eval ('(' + string_data + ')') einwandfrei funktioniert.
Dominik Ras
5

getJSON wertet die Daten für Sie in JSON aus, solange der richtige Inhaltstyp verwendet wird. Stellen Sie sicher, dass der Server die Daten als application / json zurückgibt.

kgiannakakis
quelle
1
Laut Fiddler ist der InhaltstypContent-Type: application/json; charset=utf-8
Rippo
5
$.each(JSON.parse(result), function(i, item) {
    alert(item.number);
});
Rolando Gonzales Medina
quelle