2012-02-14 6 views
0

이 찾고하는 브라우저에서보기입니다 : 이제구문 분석 지원

{ 
    "data": { 
     "request": [{ 
      "query": "Lat 41.85 and Lon -87.65", 
      "type": "LatLon" 
     }], 
     "time_zone": [{ 
      "localtime": "2012-02-14 16:05", 
      "utcOffset": "-6.0" 
     }] 
    } 
} 

,이 코드를 사용하고하는 것은 그것을 구문 분석 :

function getTimeZone(latlong) { 
    jQuery(document).ready(function ($) { 
     $.ajax({ 
      url: "http://www.worldweatheronline.com/feed/tz.ashx?key=[removed]&q=" + latlong + "&format=json", 
      dataType: "jsonp", 
      success: function (parsed_json) { 
       console.log(parsed_json.time_zone.utcOffset); 
       return parsed_json.time_zone.utcOffset; 
      }, 
      error: function (parsed_json) { 
       //console.log("Error: " + parsed_json); 
      } 
     }); 
    }); 
} 

내가 코드를 실행할 때마다, 나는 무엇입니까 이 오류 :

Uncaught TypeError: Cannot read property 'utcOffset' of undefined 

모든 도움을 주시면 감사하겠습니다.

Result: 
    Object 
    data: Object 
     request: Array[1] 
     time_zone: Array[1] 
      0: Object 
      localtime: "2012-02-14 16:46" 
      utcOffset: "-6.0" 

답변

3

는 사실, 두 가지 문제가 있습니다 :

1) 콘텐츠에 액세스하기 위해 필요한 :

parsed_json.data.time_zone [0] .utcOffset;

2) 비동기식 아약스 콜백을 사용하고 있습니다. - 프로그램이 아약스 요청을 완료하고 반환하기 전에 success()가 호출되지 않고 부모 메소드에 결과를 반환하지 않습니다. .

동기 가져 오기를 사용하지 않는 한 기본적으로 원하는 방식대로 수행 할 수 없습니다 (응답이 도착할 때까지 브라우저를 잠그므로 나쁜 생각입니다). 가 도착하면

대신, 함수에 매개 변수로, 함수가 될 것이다 콜백 매개 변수를 가지고, 그 결과로 그 전화 :

function getTimeZone(latlong, callback) { 
    jQuery(document).ready(function ($) { 
     $.ajax({ 
      url: "http://www.worldweatheronline.com/feed/tz.ashx?key=[removed]&q=" + latlong + "&format=json", 
      dataType: "jsonp", 
      success: function (parsed_json) { 
       console.log(parsed_json.time_zone.utcOffset); 
       callback(latlong, parsed_json.data.time_zone[0].utcOffset); 
      }, 
      error: function (parsed_json) { 
       //console.log("Error: " + parsed_json); 
      } 
     }); 
    }); 
} 

을 다음 그것을 사용하기 :

getTimeZone(myLatLong, function(latLong, utcOffset) { 
    // ... do something with utcOffset here ... 
}); 
+0

결과 : 개체 데이터 : 개체 요청 : 배열 [1] TIME_ZONE : 배열 [1 ] 0 : Object localtime : "2012-02-14 16:39" utcOffset : "-6.0" 올바른 데이터를 수신하는 것으로 보입니다. – Kruug

+0

Chrome/FF + Firebug에서 JS 콘솔에 멋진 중첩 트리 표시가 표시되므로 개체를 탐색하고 구조가 어떻게 구성되어 있는지 더 잘 이해할 수 있습니다. – jka6510

+0

내가 게시 한 내용은 Chrome 콘솔에 표시된 내용입니다. – Kruug

1

당신은 반환 된 JSON을주의 깊게 볼 필요가

return parsed_json.data.time_zone[0].utcOffset; 

해야합니다 데이터의

보기는 콘솔에 표시되는 (단지 내가 관심이있는 부분을 복사) 구조. 중첩을 반영하기 위해 별도의 줄과 들여 쓰기로 나누는 것이 좋습니다.

+0

도움이되지 않습니다. [0]을 추가하지 않은 이유는 루프를 수행하지 않기 때문입니다. 그게 중요합니까? 잘 모르겠다. JSON이 내가 공급자로부터 돌아 왔기 때문에 내가 편집 할 수있는 것은 아무것도 없다. – Kruug

+1

왜냐하면 'time_zone'요소가 숫자로 색인 된 배열로 반환되기 때문에 첫 번째 요소를 선택하기 위해 [0]이 필요합니다. 공급자가 응답에서 하나 이상의 시간대를 제공 할 수 있다고 가정합니다.하지만 그냥 먼저 작동해야합니다. – jka6510

+0

괜찮습니다. 그 해명을 가져 주셔서 감사합니다. – Kruug

0

parsed_json.data.time_zone[0].utcOffset이어야합니까?

+0

도움이되지 않습니다.[0]을 추가하지 않은 이유는 루프를 수행하지 않기 때문입니다. 그게 중요합니까? 인덱스는 0이고, 지정해야하므로 – Kruug

+0

시간대의 값은 해당 예컨대 하나의 개체, 개체의 배열이다 –

관련 문제