Главная > Powershell > Работа с JSON-объектами в Powershell

Работа с JSON-объектами в Powershell

Википедия определяет JSON как

текстовый формат обмена данными, основанный на JavaScript… формат считается языконезависимым и может использоваться практически с любым языком программирования.

Если говорить более конкретно, то JSON позволяет описывать объекты, на подобие того как это делает xml, но намного проще.

По сути JSON-объекты представляют собой хеш-таблицу, допускающую вложенность.

Возьмём пример всё из той же Википедии:

Следующий пример показывает JSON-представление объекта, описывающего человека. В объекте есть строковые поля имени и фамилии, объект, описывающий адрес, и массив, содержащий список телефонов.

{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddress": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}

Для работы с JSON-объектами в Powershell начиная с версии 3.0 предусмотрены специальные командлеты:

PS C:\> Get-Command '*json'

CommandType    Name                              ModuleName
-----------    ----                              ----------
Cmdlet         ConvertFrom-Json                  Microsoft.PowerShell.Utility
Cmdlet         ConvertTo-Json                    Microsoft.PowerShell.Utility

Для создания JSON-объекта его описание в определённом формате нужно поместить в here-string (многострочную текстовую переменную). Звучит страшно, но самом деле всё просто: берём описание нашего объекта выше, помещаем его между символами @” и “@ (это и есть here-string) и скармливаем всё это командлету ConvertFrom-Json, который конвертирует JSON-отформатированные строки в объект:

$User = @"
{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddress": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}
"@ | ConvertFrom-Json

Вот и всё! Объект создан. Теперь можно обращаться к отдельным свойствам объекта любой вложенности:

PS C:\> $User.firstName
Иван
PS C:\> $User.address.city
Ленинград
PS C:\> $User.phoneNumbers[0]
812 123-1234

При помощи JSON-формата очень удобно сохранять в одном объекте информацию, полученную с разных объектов и разных типов. Рассмотрим ещё один пример:

$json = @"
{
  "ServerName"        : "$env:ComputerName",
  "UserName"          : "$env:UserName",
  "ComputerInfo"      :
  {
    "Manufacturer": "$((Get-WmiObject Win32_ComputerSystem).Manufacturer)",
    "Architecture": "$((Get-wmiObject Win32_OperatingSystem).OSArchitecture)",
    "SerialNumber": "$((Get-wmiObject Win32_OperatingSystem).SerialNumber)"
  },
  "CollectionDate"    : "$(Get-Date)"
 }
"@

$Info = ConvertFrom-Json -InputObject $json

Из созданного объекта достаём, интересующие свойства:

PS C:\> $Info.ServerName
SERVER
PS C:\> $Info.UserName
admin
PS C:\> $Info.ComputerInfo.Manufacturer
System manufacturer
PS C:\> $Info.CollectionDate
07/02/2014 15:05:00
PS C:\> $Info.ComputerInfo.Architecture
64-bit

 

Если же необходимо из готового объекта сделать JSON-форматированную строку следует использовать командлет ConvertTo-Json. Например:

$File = Get-ChildItem C:\Windows\System32\calc.exe
$File.VersionInfo | ConvertTo-Json

В результате получаем:

{
    "Comments":  "",
    "CompanyName":  "Microsoft Corporation",
    "FileBuildPart":  7600,
    "FileDescription":  "Калькулятор Windows",
    "FileMajorPart":  6,
    "FileMinorPart":  1,
    "FileName":  "C:\\Windows\\System32\\calc.exe",
    "FilePrivatePart":  16385,
    "FileVersion":  "6.1.7600.16385 (win7_rtm.090713-1255)",
    "InternalName":  "CALC",
    "IsDebug":  false,
    "IsPatched":  false,
    "IsPrivateBuild":  false,
    "IsPreRelease":  false,
    "IsSpecialBuild":  false,
    "Language":  "Русский (Россия)",
    "LegalCopyright":  "© Корпорация Майкрософт. Все права защищены.",
    "LegalTrademarks":  "",
    "OriginalFilename":  "CALC.EXE.MUI",
    "PrivateBuild":  "",
    "ProductBuildPart":  7600,
    "ProductMajorPart":  6,
    "ProductMinorPart":  1,
    "ProductName":  "Операционная система Microsoft® Windows®",
    "ProductPrivatePart":  16385,
    "ProductVersion":  "6.1.7600.16385",
    "SpecialBuild":  ""
}

После создания JSON-строки, её можно легко отправить другому приложению. Наиболее частое  использование JSON – пересылка данных от сервера к браузеру. Обычно данные доставляются с помощью AJAX, который позволяет обмениваться данными между браузером и сервером без перезагрузки страницы.

JSON прост для понимания и использования, является очень гибким инструментом для передачи данных между приложениями (или даже компьютерами), а также подходит для сохранения и вывода различной информации.

Рубрики:Powershell Метки:
  1. Илья
    07/07/2019 в 08:59

    Спасибо за информацию.
    Можно ли использовать хеш таблицу в качестве атрибута объекта?

    • 08/07/2019 в 09:48

      Зачем? Можете привести пример, где такое может понадобиться?

  2. YuGn
    14/01/2020 в 18:24

    элементарно: бекапим необходимые значения атрибутов объектов AD с целью вероятного наступления события при котором необходимо восстановление первых.

  1. 06/08/2014 в 14:21

Оставьте комментарий