繁体   English   中英

如何在 Google Apps 脚本中访问已解析的嵌套 JSON 中的对象

[英]How to access object in parsed nested JSON in Google Apps Script

对于在代码、js、Google Apps 脚本和 stackoverflow.com 方面的任何错误,首先要广泛道歉。

我正在尝试从对 Google Maps 的 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);

}

我不知道如何通过数组和对象导航到折线。 我知道点表示法不适用于数组,因此使用了方括号,但无论我尝试什么,我都无法在没有得到 'TypeError: cannot read property "steps" from undefined' 的情况下前进data["routes"]["legs"] . 我知道问题可能在于我不了解数据结构,但是经过数小时的搜索,包括使用在线 Json Parser来阐明结构,我仍然卡住了,因此将不胜感激。 谢谢!

在处理复杂的嵌套 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对象)。

我有一个类似的问题。

[
{
    "NOMBRE": "ViejosNoUsarEl Quebrachal",
    "ACTIVO": false,
    "CODIGO": "ViejosNoUsarQUEB",
    "CALLE": null,
    "NUMERO": null,
    "PROVINCIA": "Jujuy",
    "LOCALIDAD": "EL MORRO",
    "ZONA": null,
    "SUPERFICIE": 3900,
    "CODIGOEXTERNO": ""
},
{
    "NOMBRE": "ViejoNoUsarSanta Teresa",
    "ACTIVO": false,
    "CODIGO": "ViejoNoUsarST",
    "CALLE": null,
    "NUMERO": null,
    "PROVINCIA": "San Luis",
    "LOCALIDAD": "Villa MercedesOLD",
    "ZONA": "Oeste",
    "SUPERFICIE": 3700,
    "CODIGOEXTERNO": ""
},
{
    "NOMBRE": "ViejosNoUsarGil",
    "ACTIVO": false,
    "CODIGO": "ViejosNoUsarGIL",
    "CALLE": null,
    "NUMERO": null,
    "PROVINCIA": "Cordoba",
    "LOCALIDAD": "9 DE JULIO",
    "ZONA": "Oeste",
    "SUPERFICIE": 200,
    "CODIGOEXTERNO": ""
},
{
    "NOMBRE": "ViejosNoUsarDon Manuel",
    "ACTIVO": false,
    "CODIGO": "ViejosNoUsarDM",
    "CALLE": null,
    "NUMERO": null,
    "PROVINCIA": "Cordoba",
    "LOCALIDAD": "9 DE JULIO",
    "ZONA": "Oeste",
    "SUPERFICIE": 400,
    "CODIGOEXTERNO": ""
}
]

那是我的 JSON,我想使用谷歌应用程序脚本在谷歌工作表上创建与数组中的对象一样多的行。

在这种情况下,将有 4 个 google sheet 行。 我只想解析属性的值。

例如,第一行如下所示:

ViejosNoUsarEl Quebrachal | 假 | 别荷斯NoUsarQUEB | 空 | 空 | 胡胡伊 | 埃尔莫罗 | 空 | 3900 |

这是我在应用程序脚本中使用的代码:

function doGet() {

let config = {
muteHttpExceptions: true,
method: "get"
};

let response = UrlFetchApp.fetch("https://j11.teamplace.finneg.com/BSA/api/reports/ApiEstablecimiento?ACCESS_TOKEN=2c96e31c-5a27-4694-953b-cd08fcaf3997", config);

var spreadsheetId = "1opWEqkg29aCpZKOY-zDlO-RfprwrNq6FMiHMTWkYtXQ";
var sheetName = "Hoja 3";
var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
var rows = response.rows;

var data = JSON.parse(response.getContentText());

Logger.log(data.provincia);

for(var i = 0; i < data.rows.length; i++){
sheet.appendRow(data.rows[i])
}
return ContentService.createTextOutput(JSON.stringify({sheet:sheetName, rows: 
rows}))
}

问题是我无法使用点符号来提取我想要的值。 例如 Logger.log(data.provincia); 打印“信息为空”。

@haf-体面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM