0

廣泛的道歉,首先涉及到涉及代碼,js,Google Apps腳本和stackoverflow.com的n00b相關的任何錯誤。如何訪問Google Apps腳本中已解析的嵌套JSON中的對象

我試圖從API調用中提取多段線到谷歌地圖的Directions API。從API的結果分析,我得到:

{routes=[{summary=A215, copyrights=Map data ©2017 Google, legs=[{duration={text=18 mins, value=1108}, start_location={lng=-0.1295712, lat=51.4227696}, distance={text=7.2 km, value=7187}, start_address=London SW16 6ET, UK, end_location={lng=-0.0706306, lat=51.3869032}, duration_in_traffic={text=15 mins, value=882}, end_address=Woodside Green, London SE25 5EU, UK, via_waypoint=[], steps=[{duration={text=1 min, value=6}, start_location={lng=-0.1295712, lat=51.4227696}, distance={text=29 m, value=29}, travel_mode=DRIVING, html_instructions=Head <b>north</b> on <b>Streatham High Rd</b>/<b>A23</b> toward <b>Streatham Common N</b>/<b>A214</b>, end_location={lng=-0.1297011, lat=51.42301399999999}, polyline={[email protected]}},.... 

我的腳本如下:

function listJourneyPoints(value) { 

    //Temporary url for var value 
    var value = "https://maps.googleapis.com/maps/api/directions/json?origin=SW16%206ET&destination=SE25%205EU&mode=driving&region=UK&departure_time=1507676400&key=AIzaSyDbswrt7RFy3s13ulO9BUY9jQUNchUfi4o"; 

    //Call the google route planner api 
    var routeResponse = UrlFetchApp.fetch(value); 

    //Parse JSON from routeResponse 
    var json = routeResponse.getContentText(); 
    var data = JSON.parse(json); 

    //Get the polyline 
    var polyl = data["routes"]["legs"]["steps"]["polyline"]; 
    Logger.log (polyl); 

} 

我不能工作了如何通過數組和對象的折線導航。我知道點符號不適用於數組,所以使用了方括號,但無論我嘗試如何,我都無法通過data["routes"]["legs"]繼續前進,但未從'未定義'中獲取「TypeError:無法讀取屬性」步驟。我知道這個問題可能在於我不瞭解數據結構,但經過幾個小時的搜索,包括使用online Json Parser來闡明結構,我仍然堅持,所以將不勝感激任何幫助。謝謝!

+1

首先,「路線」不是一個對象,而是一個對象數組,因此它必須使用數字進行索引; 「腿」和「步」也一樣。 因此,要獲得的第一個對象的折線屬性的步驟數組中,第一腿陣列的對象的,路由數組的第一個對象,你會寫: data.routes [0] .legs [0] .steps [0] .polyline –

回答

0

當處理複雜的嵌套JSON時,我喜歡多次瀏覽它,以便更好地瞭解發生了什麼。即使沒有,雖然,添加一些格式化的JSON,看看它的結構和刪除不需要的條目既可以在看到如何訪問特定的元素會有所幫助:

{ 
    routes: [{ 
    legs: [{ 
     steps: [{ 
     polyline: { 
      points: [email protected] 
     } 
     }] 
    }] 
    }] 
} 

所以要注意到的第一件事是,routes持有一個數組,這意味着我們需要訪問其索引來訪問嵌套對象。幸運的是,所有的嵌套元素都包裝在一個對象中,所以我們可以訪問數組的第一個元素:data["routes"][0]。如果我繼續陷入嵌套對象的困境,我將繼續使用Logger.log(data["routes"][0]...)來查看下一個鍵/索引應該是什麼。

看起來你對層次結構有很好的想法,而你只是缺少對象的數組部分,這就是爲什麼你會得到錯誤。因此,在每次按鍵通話後加入[0]應該可以解決您的問題。另外,就像旁註一樣,您可以在訪問Google腳本中的對象中的鍵時使用點符號,即data.routes[0].legs[0].steps[0].polyline(返回polyline對象)。

+0

非常感謝您提供了這樣一個清晰有用的答案。最初當我嘗試時,我得到了同樣的錯誤;然而,後來我發現,api調用中的時代現在已經過去了。一旦我改變了未來的一點,它完美的作品。我現在對我之前的陣列/對象混淆現象也更加清楚。我非常感謝你花時間來幫助我 - 再次感謝:-) –