А АFriday, 12 November 2021

JSON и Powershell.


Всем привет. 

Если вы работали в ИТ-сфере в течение последних пяти лет, вы, вероятно, сталкивались с объектами JSON. JavaScript Object Notation (JSON), созданный в начале 2000-х годов, представляет собой машиночитаемый, но при этом понятный человеку язык иерархической организации наборов данных. Как следует из названия, такое представление данных активно использовалось в приложениях JavaScript, а следовательно, и в веб-разработке. Недавний всплеск числа онлайн-сервисов, пользующихся REST API (это технология, которую используют для передачи данных между клиентом и сервером), привел к параллельному всплеску использования JSON. Если вы что-то делаете в интернете, вам пригодится навык работы с файлами JSON, которыми можно легко управлять в PowerShell.

Если говорить более конкретно, то 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

SERVER01

PS C:\> $Info.UserName

admin

PS C:\> $Info.ComputerInfo.Manufacturer

System manufacturer

PS C:\> $Info.CollectionDate

07/11/2021 10: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":  19041,

    "FileDescription":  "Windows Calculator",

    "FileMajorPart":  10,

    "FileMinorPart":  0,

    "FileName":  "C:\\Windows\\System32\\calc.exe",

    "FilePrivatePart":  1,

    "FileVersion":  "10.0.19041.1 (WinBuild.160101.0800)",

    "InternalName":  "CALC",

    "IsDebug":  false,

    "IsPatched":  false,

    "IsPrivateBuild":  false,

    "IsPreRelease":  false,

    "IsSpecialBuild":  false,

    "Language":  "Английский (США)",

    "LegalCopyright":  "© Microsoft Corporation. All rights reserved.",

    "LegalTrademarks":  "",

    "OriginalFilename":  "CALC.EXE",

    "PrivateBuild":  "",

    "ProductBuildPart":  19041,

    "ProductMajorPart":  10,

    "ProductMinorPart":  0,

    "ProductName":  "Microsoft® Windows® Operating System",

    "ProductPrivatePart":  1,

    "ProductVersion":  "10.0.19041.1",

    "SpecialBuild":  "",

    "FileVersionRaw":  {

                           "Major":  10,

                           "Minor":  0,

                           "Build":  19041,

                           "Revision":  1,

                           "MajorRevision":  0,

                           "MinorRevision":  1

                       },

    "ProductVersionRaw":  {

                              "Major":  10,

                              "Minor":  0,

                              "Build":  19041,

                              "Revision":  1,

                              "MajorRevision":  0,

                              "MinorRevision":  1

                          }

}

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

Теперь, когда вы знаете, как работать с данными JSON, в следующий раз сделаем нечто более интересное - мы воспользуемся PowerShell для запроса REST API и анализа полученных результатов.

Увидимся.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное