Применение данных веб-служб в формате JSON средствами PowerShell. Продолжение
Сравним это представление с представлением той же классификации животных в формате JSON (см. скриншот выше).
Оба формата справляются с задачей по-разному. После предварительного анализа ясно, что JSON для описания объектов использует фигурные скобки ({}) и массивы в квадратных скобках ([]), элементы которых (в нашем случае — три типа животных) разделены запятыми.
К сожалению, реальные веб-службы выдают данные JSON в виде длинной строки текста, а не удобной для восприятия структуры, показанной в нашем примере. Это может затруднять поиск нужных данных, если не прибегнуть к помощи подключаемого модуля Chrome под названием JSON Formatter (или JSONView — для пользователей Firefox). У Internet Explorer модуль структурной распечатки отсутствует, поэтому я предпочитаю не использовать IE с JSON.
Ответ на запрос по почтовому индексу
Структурная печать важна, поскольку позволяет получить иерархическое представление, которое помогает извлечь нужные данные. Реализованная в PowerShell поддержка JSON не предусматривает чего-либо, подобного Xpath. Фрагмент структурной распечатки данных, полученных в ответ на запрос по почтовому индексу 12345, показан на скриншоте выше. Здесь хорошо видно, что объект resourceSets содержит объект по имени resources, который содержит объект по имени address, а тот в свою очередь содержит нужные нам объекты adminDistrict (административный округ), adminDistrict2 (штат) и locality (город). Будь это объект PowerShell, мы бы смогли извлечь locality с помощью точечной нотации
$somevariable.resourceSets.resources.address.localityОднако мы имеем дело с объектом JSON, а не PowerShell, и именно здесь нам пригодится команда Invoke-RestMethod, которая, по сути, является дубликатом Invoke-WebRequest, за исключением того, что она ориентирована на объекты JSON и автоматически представляет их в виде объекта PowerShell:
$URI = " http://dev.virtualearth.net/REST/v1/Locations?q=12345,%20USA&key=BingKey"
$Result = Invoke-RestMethod $URIТеперь объекты JSON «живут» в переменной SResult как объекты PowerShell. Для того чтобы вывести искомый город (locality), достаточно ввести:
$Result.resourceSets.resources.address.locality
Словом, если выяснится, что веб-служба в ответ на запрос выдает данные в формате JSON, взгляните на структурную распечатку этих данных, чтобы узнать иерархию объекта, а затем с помощью Invoke-RestMethod преобразуйте данные JSON в объект PowerShell и примените точечную нотацию PowerShell для извлечения желаемого элемента.