Работа с 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 прост для понимания и использования, является очень гибким инструментом для передачи данных между приложениями (или даже компьютерами), а также подходит для сохранения и вывода различной информации.
Спасибо за информацию.
Можно ли использовать хеш таблицу в качестве атрибута объекта?
Зачем? Можете привести пример, где такое может понадобиться?
элементарно: бекапим необходимые значения атрибутов объектов AD с целью вероятного наступления события при котором необходимо восстановление первых.