Выполните цикл по списку Json в запросе питания Excel для получения записи

#json #excel #powerquery

#json #превосходить #запрос мощности

Вопрос:

У меня есть запрос питания, который вызывает Google Maps API и возвращает Json следующим образом

 let  baseurl = "https://maps.googleapis.com/maps/api/geocode/json?",  cellAddress = Excel.CurrentWorkbook(){[Name="Address"]}[Content]{0}[Column1],  stepOneAdress = Replacer.ReplaceText(cellAddress, "Addrs: ", ""),  noSpaceAdress = Replacer.ReplaceText(stepOneAdress, " ", " "),  noCommasAdress = Replacer.ReplaceText(noSpaceAdress, ",", ","),  fullUrl = baseurlamp;"address="amp;noCommasAdressamp;"amp;key=AIzaSyCwcLo1bl8iTSWhU3vgHNuq3rJHbSGH-Pw",   webdata = Web.Contents(fullUrl),   response = Json.Document(webdata),  results = response[results],  data = results{0}   in  data  

Данные выглядят следующим образом

 {  "results" : [  {  "address_components" : [  {  "long_name" : "Steamboat Springs",  "short_name" : "Steamboat Springs",  "types" : [ "locality", "political" ]  },  {  "long_name" : "Routt County",  "short_name" : "Routt County",  "types" : [ "administrative_area_level_2", "political" ]  },  {  "long_name" : "Colorado",  "short_name" : "CO",  "types" : [ "administrative_area_level_1", "political" ]  },  {  "long_name" : "United States",  "short_name" : "US",  "types" : [ "country", "political" ]  },  {  "long_name" : "80487",  "short_name" : "80487",  "types" : [ "postal_code" ]  }  ],  "formatted_address" : "Steamboat Springs, CO 80487, USA",  "geometry" : {  "bounds" : {  "northeast" : {  "lat" : 40.5286781,  "lng" : -106.7801651  },  "southwest" : {  "lat" : 40.439399,  "lng" : -106.886848  }  },  "location" : {  "lat" : 40.4849769,  "lng" : -106.8317158  },  "location_type" : "APPROXIMATE",  "viewport" : {  "northeast" : {  "lat" : 40.5286781,  "lng" : -106.7801651  },  "southwest" : {  "lat" : 40.439399,  "lng" : -106.886848  }  }  },  "place_id" : "ChIJYUZWCYF7QocRfc9uSNGjqBs",  "types" : [ "locality", "political" ]  }  ],  "status" : "OK" }  

Затем я могу прочитать «данные» из этого запроса питания в другом запросе питания, где я пытаюсь получить данные почтового индекса.

 let  data = Coordinates,  address_components = data[address_components],  address_components1 = address_components{6} in  address_components1  

адрес_компонент1 (я знаю ужасное имя, но все еще создаю прототип) это запись Json, которая затем используется еще одним запросом.

Но значение из списка Json жестко закодировано, как вы можете видеть, это шестой элемент в списке. Но я обнаружил, что почтовый индекс, который мне нужен, не всегда находится на шестой позиции в списке.

В записях есть список типов, который я хочу прочитать и определить, равен ли тип «postal_code».

Однако я не могу понять, как просмотреть список и проверить каждый элемент.

Я бы хотел, чтобы это было что-то вроде

 address_component1, foreach(item in address_components){  type_list = item["types"],  if type_list = "postal_code"  address_component1 = item,   

Возможно ли это сделать таким образом?

Ответ №1:

Если на самом деле ваш json такой, как вы показываете, в отношении:

  • один элемент почтового индекса
  • содержащий один почтовый индекс

Вы можете извлечь его с помощью следующего кода:

  • Сначала извлеките address_components его в список записей
  • Просмотрите каждую запись, чтобы увидеть, является ли первый элемент types postal_code
  • если это так, то верните long_name

Если json должен включать более одного postal_code , может потребоваться другой алгоритм.

 let  Source = Json.Document(File.Contents("C:UsersronDesktopnew 3.json")),  //extract the address_components  address_components = Source[results]{0}[address_components],  //find the postal code and extract it  postalCode=List.Accumulate(address_components,"", (state, current)=gt;  if Record.Field(current,"types"){0} = "postal_code" then state amp; Record.Field(current,"long_name") else state) in  postalCode  

postalCode будет содержать почтовый индекс в виде текстовой строки.