0

코드, js, Google Apps Script 및 실제로 stackoverflow.com과 관련하여 n00b가되는 것과 관련하여 광범위한 스펙트럼 사과를 시작합니다.Google Apps Script에서 파싱 된 중첩 JSON으로 객체에 액세스하는 방법

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={[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); 

} 

나는 폴리 라인에 배열과 객체를 탐색하는 방법을 작동하지 않을 수 있습니다. 나는 점 표기법이 대괄호를 사용했기 때문에 배열에서 작동하지 않는다는 것을 알고 있습니다. 그러나 무엇이든 시도해 보니을 얻지 않고 'TypeError : 속성을 읽을 수 없습니다 "단계가 정의되지 않은 상태에서 읽을 수 없습니다. 나는 아마도 데이터 구조를 이해하지 못하는 문제가 있음을 알고 있지만, 구조를 설명하기 위해 online Json Parser을 사용하는 것을 포함하여 몇 시간의 검색 후에도 나는 여전히 고착되어 있으므로 도움이된다면 감사 할 것입니다. 감사!

+1

먼저 "routes"는 객체가 아니라 객체의 배열이므로 숫자를 사용하여 색인을 생성해야합니다. "다리"와 "계단"도 마찬가지입니다. data.routes : 그래서 다리 배열의 객체의 첫 번째의, 단계 배열의 첫 번째 개체의 폴리 라인 속성을 얻기 위해, 경로 배열의 첫 번째 목적, 당신은 다음과 같이 작성 [0] .legs [0] .steps [0] .polyline –

답변

0

복잡하게 중첩 된 JSON으로 작업 할 때는 Logger.log()을 여러 번 탐색하여 진행 상황을보다 자세히 살펴볼 수 있습니다. 그래서 주목해야 할 첫 번째 일은 routes가 보유하고 있다는 점이다

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

: 심지어 그 생각하지 않고, 그것의 구조를 확인하기 위해 JSON에 일부 서식을 추가하고 불필요한 항목을 제거하는 것은 모두 특정 요소에 액세스하는 방법을보고 도움이 될 수 있습니다 이는 중첩 된 객체에 액세스하기 위해 색인에 액세스해야한다는 것을 의미합니다. 다행히도 중첩 된 요소는 모두 객체에 래핑되므로 배열의 첫 번째 요소 인 data["routes"][0]에 액세스 할 수 있습니다. 중첩 된 객체로 들어가는 과정에서 문제가 계속 발생하면 Logger.log(data["routes"][0]...)을 계속 사용하여 다음 키/색인이 무엇인지 확인합니다.

당신은 계층 구조에 대해 아주 잘 알고있는 것처럼 보입니다. 개체의 배열 부분이 누락 된 것 같습니다. 따라서 오류가 발생하는 것입니다. 그러므로 각 키 호출 후에 [0]을 추가하면 문제가 해결됩니다.

또한, 사이드 노트와 마찬가지로 data.routes[0].legs[0].steps[0].polyline (polyline 개체를 반환)과 같이 Google 스크립트에서 개체의 키에 액세스 할 때 점 표기법을 사용할 수 있습니다.

+0

이렇게 명확하고 유용한 답변을 해주셔서 감사합니다. 처음에 시도했을 때 같은 오류가 발생했습니다. 그러나 그것은 나에게 API 호출의 신기원 (epoch) 시간이 과거에 일어났습니다. 일단 내가 미래의 포인트로 변경하면 완벽하게 작동합니다. 나는 이전의 배열/객체 혼동에 대해서도 훨씬 더 명확 해졌습니다. 이 일을 도와 준 시간에 정말 감사드립니다. 다시 한번 감사드립니다. –