vòng lặp jquery trên dữ liệu Json bằng cách sử dụng $ .each


160

Tôi có JSON sau đây được trả về trong một biến gọi là dữ liệu.

ĐÂY LÀ JSON MÀ ĐƯỢC TRỞ LẠI ...

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

và tôi đang cố gắng lặp lại bộ sưu tập bằng $ .each nhưng tôi đang gặp vấn đề trong đó cảnh báo hiển thị không xác định. Tôi đã thử rất nhiều cú pháp khác nhau nhưng dường như không thể tìm ra điều này.

JQuery tôi đang sử dụng là

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

Ai đó có thể chỉ cho tôi phương hướng đúng không?

EDIT Đây là mã tôi đang sử dụng để lấy dữ liệu

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

và đây là chức năng được gọi khi gọi lại

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

EDIT 2 Điều này hơi khó hiểu với tôi, theo các tài liệu nó sẽ hoạt động như tôi có, nhưng nó không. Theo fiddler, tiêu đề cho thấy: -

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

và JSON là chính xác ở trên. Tôi đang sử dụng chrome nếu điều này làm cho bất kỳ khác biệt. Sẽ kiểm tra trong IE và FF ....

EDIT 3

sử dụng $ .get tạo ra

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

Nó làm việc cho tôi. Đảm bảo dữ liệu được truyền chính xác cho từng phương thức.
kgiannakakis

Câu trả lời:


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

Hai tùy chọn này hoạt động tốt, trừ khi bạn có một cái gì đó như:

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

BIÊN TẬP:

thử với điều này và mô tả kết quả

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

CHO EDIT 3:

điều này khắc phục vấn đề, nhưng không phải là ý tưởng sử dụng "eval", bạn nên xem phản hồi trong '/ Cms / GetPages / 123' như thế nào.

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

1
Có vẻ như tôi cần thêmeval(data)
Rippo

trong hàm "httpData" trong jQuery, bạn có thể thấy một cửa sổ được gọi là ["eval"] cho dữ liệu json. bạn không cần sử dụng eval. dòng này "$. get ('/ Cms / GetPages / 123'" là để cho bạn thấy rằng họ đang nhận được trong "dữ liệu".
andres descalzo


Đã cập nhật câu trả lời (xem EDIT 3) để hiển thị những gì $.gettạo ra
Rippo

Làm thế nào bạn trả lại dữ liệu trong "/ Cms / GetPages / 123"?
andres descalzo

17

Bạn đã chuyển đổi dữ liệu của mình từ chuỗi sang đối tượng JavaScript chưa?

Bạn có thể làm điều đó với data = eval('(' + string_data + ')'); hoặc, an toàn hơn, data = JSON.parse(string_data);nhưng sau này sẽ chỉ hoạt động trong FF 3.5 hoặc nếu bạn bao gồm json2.js

jQuery kể từ 1.4.1 cũng có chức năng đó $.parseJSON().

Nhưng trên thực tế, $.getJSON()nên cung cấp cho bạn đối tượng json đã được phân tích cú pháp, vì vậy bạn chỉ cần kiểm tra mọi thứ kỹ lưỡng, có một chút sai lầm bị chôn vùi ở đâu đó, như bạn có thể đã quên trích dẫn một cái gì đó trong json, hoặc một trong các dấu ngoặc bị thiếu.


Có vẻ như tôi cần thêmfillselect(eval(data));
Rippo

BTW tương thích như thế nào eval?
Rippo

3
Điều đó nên được data = eval('('+string_data+')');. Ngoài ra, jQuery có một chức năng khácdata = jQuery.parseJSON(string_data);
Greg

Có một cái gì đó không hoàn toàn đúng. chỉ eval(data)hoạt động. Vui lòng xem EDIT 2 của tôi
Rippo

2
Tôi đã thấy jQuery.parseJSON (string_data) thất bại trong một số trường hợp nhất định, trong đó data = eval ('(' + string_data + ')') hoạt động tốt.
Dominik Ras

5

getJSON sẽ đánh giá dữ liệu thành JSON cho bạn, miễn là loại nội dung chính xác được sử dụng. Đảm bảo rằng máy chủ đang trả về dữ liệu dưới dạng ứng dụng / json.


1
theo fiddler loại nội dung làContent-Type: application/json; charset=utf-8
Rippo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.