#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
будет содержать почтовый индекс в виде текстовой строки.