【问题标题】:How to access object in parsed nested JSON in Google Apps Script如何在 Google Apps 脚本中解析嵌套 JSON 中的对象
【发布时间】:2025-12-20 10:20:18
【问题描述】:

首先,对于在代码、js、Google Apps 脚本以及 *.com 方面与成为 n00b 相关的任何错误,我们深表歉意。

我正在尝试从对 Google 地图的 Directions API 的 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={points=iozxHxhXo@X}},....

我的脚本如下:

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 来阐明结构,我仍然卡住了,所以如果有任何帮助,我将不胜感激。谢谢!

【问题讨论】:

  • 首先,“路由”不是一个对象,而是一个对象数组,因此必须使用数字进行索引; “腿”和“台阶”也是如此。因此,要获取 steps 数组中的第一个对象、legs 数组的第一个对象、routes 数组的第一个对象的折线属性,您可以编写以下内容: data.routes[0].legs[ 0].steps[0].polyline

标签: javascript json parsing google-apps-script google-directions-api


【解决方案1】:

在处理复杂的嵌套 JSON 时,我喜欢在导航时多次 Logger.log() 以更好地了解正在发生的事情。即使没有,向 JSON 添加一些格式以查看其结构并删除不需要的条目都有助于了解如何访问特定元素:

{
  routes: [{
    legs: [{
      steps: [{
        polyline: {
          points: iozxHxhXo@X
        }
      }]
    }]
  }]
}

所以首先要注意的是routes 包含一个数组,这意味着我们需要访问它的索引来访问嵌套对象。幸运的是,所有嵌套元素都包装在一个对象中,因此我们可以访问数组的第一个元素:data["routes"][0]。如果我在深入嵌套对象时仍然遇到问题,我将继续使用Logger.log(data["routes"][0]...) 来查看下一个键/索引应该是什么。

看起来您对层次结构有一个很好的了解,而您只是缺少对象的数组部分,这就是您收到错误的原因。因此,在每次按键调用后添加 [0] 应该可以解决您的问题。

另外,作为旁注,您可以在访问 Google 脚本中对象中的键时使用点表示法,即 data.routes[0].legs[0].steps[0].polyline(返回 polyline 对象)。

【讨论】:

  • 感谢您提供如此清晰而有帮助的答案。最初当我尝试时,我得到了同样的错误;然而,我突然想到 api 调用中的纪元时间现在已经过去了。一旦我将其更改为未来点,它就会完美运行。我现在对我之前的数组/对象混淆也更加清楚了。我非常感谢您花时间帮助我 - 再次感谢 :-)