| | 0

Why using JSON Files in PowerShell is neat

In the last couple of weeks I worked a lot with PowerShell and text-based input files to separate code and data. Since my beginnings in PowerShell I always used XML-based files to cover the separation.

The task I am currently working on is very complex and the designed XML data structure is not readable in an editor like notepad++ anymore. Due to this I had to search for an alternative file format. Some colleagues of mine are currently involved in Microsoft Azure projects and I heard about the JSON file format from them. JSON stands for JavaScript Object Notation (http://en.wikipedia.org/wiki/JSON) and is a well-known format within Azure. JSON provides a set of supported data types you can use directly (like Number, String, Boolean, Array, …) what is very handy and easy to adopt.

During my research and testing I found a lot of helpful websites and blogs covering JSON handling within PowerShell. Within this article I want to share some of my experiences with you.

Example

First, let’s have a look at a simple JSON file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
    "Name": "Timm-TestCatalog-002",
    "Description": "Timm-TestCatalog-002",
    "AllocationType": "Random",
    "ProvisioningType": "Manual",
    "SessionSupport": "MultiSession",
    "PersistUserChanges": "OnLocal",
    "ProvisioningSchemeId": "",
    "CatalogKind": "",
    "PvsForVM": "",
    "IsRemotePC": false,
    "MachinesArePhysical": true,
    "MinimumFunctionalLevel": "L7_6",
    "PvsAddress": "",
    "PvsDomain": "",
    "RemotePCHypervisorConnectionUid": "",
    "Scope": [
        "sepago-Admins",
        "sepago-Helpdesk"
    ]
}

As you can see within this example – description of a XenDesktop Catalog – I use different data types (String, Boolean, Array).

Now I can easily import this JSON file into PowerShell with the following command one-liner:

1
$JSONFile = ConvertFrom-Json "$(get-content $(Join-Path $env:temp "File.json"))"

Within the PowerShell $JSONFile is a PSCustomObject:

1
2
3
4
5
$JSONFile.gettype()
IsPublic    IsSerial        Name               BaseType
--------    --------        ----               --------
True        False           PSCustomObject         System.Object

And the NoteProperty “IsRemotePC” is a Boolean – as expected:

1
2
3
4
5
$JSONFile.isRemotePC.GetType()
IsPublic    IsSerial        Name            BaseType                                                                                                                          
--------    --------        ----            --------                                                                                                                          
True        True            Boolean         System.ValueType

Now I can use these information to create a new catalog within XenDesktop. To do this, transform the PSCustomObject into a Hash Table, which can be provided directly to the Citrix XenDesktop cmdlet (see my previous post covering parameters and Hash Tables):

1
2
3
4
5
$HashTable = @{}
$JSONFile | get-member -MemberType NoteProperty | Where-Object{ -not [string]::IsNullOrEmpty($JSONFile."$($_.name)")} | ForEach-Object {$HashTable.add($_.name,$ JSONFile."$($_.name)")}
$BrokerCatalog = New-BrokerCatalog @HashTable

Conclusion

As you see working with JSON files within PowerShell is very neat. The example I shared with you is not that difficult, sure. Within my PowerShell scripts I am currently working with JSON file with more than 200 lines and multiple sections resulting in different Hash Tables. I will share more examples with you in one of my following articles.