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

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

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.


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.


1
Laut Fiddler ist der InhaltstypContent-Type: application/json; charset=utf-8
Rippo

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.