2012-02-14 111 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)這有點複雜 - 您正在使用異步ajax回調 - success()在您的程序完成發送ajax請求並返回之前未被調用,並且它不會將其結果返回給父方法。

除非您使用同步抓取(一個壞主意,因爲它會鎖定您的瀏覽器,直到響應到達),否則基本上無法以您想要的方式進行操作。

相反,採取一個回調參數,這將是一個函數,作爲參數傳遞給你的函數,並調用其結果,一旦它到達:

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:對象 localtime:「2012-02-14 16:39」 utcOffset:「-6.0」 看起來它正在接收正確的數據。 – Kruug 2012-02-14 22:40:09

+0

在Chrome/FF + Firebug中,您可以在JS控制檯中獲得一個很好的嵌套樹顯示,這樣您就可以瀏覽該對象並更好地瞭解它的結構。 – jka6510 2012-02-14 22:43:02

+0

我發佈的是Chrome控制檯顯示的內容。 – Kruug 2012-02-14 22:46:08

1

應該

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

你必須在返回的JSON仔細看結構體。它有助於將其分解成單獨的行和縮進以反映嵌套。

+0

它似乎沒有幫助。我沒有添加[0]的原因是我沒有做循環。這很重要嗎? 不知道如何分解它,因爲這是我從提供商處獲得的JSON,我無法編輯。 – Kruug 2012-02-14 22:41:30

+1

這是因爲'time_zone'元素是作爲數字索引數組返回的,所以您需要[0]從中選擇第一個元素 - 我假設它意味着提供者可以在響應中提供多個時區,但是如果您只需要第一個,那應該很好。 – jka6510 2012-02-14 22:44:55

+0

好的。謝謝你的澄清。 – Kruug 2012-02-14 22:46:40

0

應該是parsed_json.data.time_zone[0].utcOffset

+0

它似乎沒有幫助。我沒有添加[0]的原因是我沒有做循環。這很重要嗎? – Kruug 2012-02-14 22:41:15

+0

的時區值是對象的數組,在你的例子只有一個對象,因此,其索引爲0和應該被指定 – 2012-02-14 22:46:43