$ .each를 사용하여 Json 데이터의 jquery 루프


160

data라는 변수에 다음 JSON이 반환되었습니다.

이것은 겟트 된 JSON입니다 ...

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

$ .each를 사용하여 컬렉션을 반복하려고하지만 경고가 정의되지 않은 문제가 발생합니다. 나는 많은 다른 구문을 시도했지만 이것을 알아낼 수없는 것 같습니다.

내가 사용하는 JQuery는

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

어느 쪽이 올바른 방향으로 나를 가리킬 수 있습니까?

편집 이것은 데이터를 얻는 데 사용하는 코드입니다

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

이것은 콜백시 호출되는 함수입니다.

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

편집 2 이것은 내가 가지고있는 것처럼 작동 해야하는 문서에 따르면 약간 혼란 스럽지만 그렇지 않습니다. 피들러에 따르면 헤더는 다음과 같이 표시됩니다.

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

그리고 JSON은 위에서 정확히 정확합니다. 이것이 다른 경우 크롬을 사용하고 있습니다. IE와 FF에서 테스트합니다 ....

편집 3

$ .get을 사용하면

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

그것은 나를 위해 작동합니다. 데이터가 각 메소드에 올바르게 전달되는지 확인하십시오.
kgiannakakis

답변:


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

이 두 가지 옵션은 다음과 같은 것이 없으면 잘 작동합니다.

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

편집하다:

이것으로 시도하고 결과를 설명하십시오

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

편집 3 :

이렇게하면 문제가 해결되지만 "eval"을 사용하려는 아이디어는 아닙니다. '/ Cms / GetPages / 123'의 응답이 어떻습니까?

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

1
내가 추가해야 할 것 같습니다eval(data)
Rippo

jQuery의 "httpData"함수에서 json 데이터에 대해 호출 된 window [ "eval"]을 볼 수 있습니다. eval을 사용할 필요는 없습니다. 이 줄 "$. get ( '/ Cms / GetPages / 123'"은 "data"로 수신중인 것을 보여줍니다.
andres descalzo


업데이트 된 대답을 것을 보여주기 위해 (EDIT 3 참조) $.get생산
Rippo

"/ Cms / GetPages / 123"의 데이터를 어떻게 반환합니까?
andres descalzo

17

데이터를 문자열에서 JavaScript 객체로 변환 했습니까?

data = eval('(' + string_data + ')'); 또는 더 안전하거나 사용 하여 수행 할 수 data = JSON.parse(string_data);있지만 나중에 FF 3.5 또는 json2.js 를 포함하는 경우에만 작동합니다

1.4.1 이후 jQuery에는 그 기능도 있습니다 $.parseJSON().

그러나 실제로 $.getJSON() 는 이미 구문 분석 된 json 객체를 제공해야하므로 모든 것을 철저히 확인해야합니다 .json에 무언가를 인용하지 않았거나 대괄호 중 하나가 누락 된 것처럼 어딘가에 묻힌 실수가 거의 없습니다.


내가 추가해야 할 것 같습니다fillselect(eval(data));
Rippo

BTW 얼마나 호환 eval됩니까?
Rippo

3
이어야합니다 data = eval('('+string_data+')');. 또한 jQuery에는 또 다른 기능이 있습니다data = jQuery.parseJSON(string_data);
Greg Greg

옳지 않은 것이 있습니다. 만 eval(data)작동합니다. 내 편집 2
Rippo를

2
data = eval ( '('+ string_data + ')')이 제대로 작동하는 특정 인스턴스에서 jQuery.parseJSON (string_data)이 실패하는 것을 보았습니다.
도미니크 라스

5

getJSON은 올바른 content-type이 사용되는 한 데이터를 JSON으로 평가합니다. 서버가 애플리케이션 / json으로 데이터를 리턴하는지 확인하십시오.


1
피들러에 따르면 내용 유형은Content-Type: application/json; charset=utf-8
Rippo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.