Private/Expand-JsonItem.ps1

Function Expand-JsonItem
{
    <#
        .SYNOPSIS
        { required: high level overview }

        .DESCRIPTION
        { required: more detailed description of the function's purpose }

        .NOTES
        Troy Lindsay
        Twitter: @troylindsay42
        GitHub: tlindsay42

        .PARAMETER InputObject
        { required: description of the specified input parameter's purpose }

        .INPUTS
        System.Management.Automation.PSObject

        .OUTPUTS
        System.String

        .LINK
        https://github.com/tlindsay42/ArmorPowerShell

        .LINK
        https://docs.armor.com/display/KBSS/Armor+API+Guide

        .LINK
        https://developer.armor.com/

        .EXAMPLE
        {required: show one or more examples using the function}
    #>


    [CmdletBinding()]
    Param
    (
        [Parameter( Position = 0, ValueFromPipeline = $true )]
        $InputObject = $null
    )

    Begin
    {
        # The Begin section is used to perform one-time loads of data necessary to carry out the function's purpose
        # If a command needs to be run with each iteration or pipeline input, place it in the Process section

        #$function = $MyInvocation.MyCommand.Name

        #Write-Verbose -Message ( 'Beginning {0}.' -f $function )
    } # End of Begin

    Process
    {
        $return = $null

        Switch -Regex ( $InputObject.PSObject.TypeNames )
        {
            'Array'
            {
                $return = @()

                $InputObject.ForEach( { <# Recurse #> $return += , ( Expand-JsonItem -InputObject $_ ) } )

                Break
            }

            'Dictionary'
            {
                $return = New-Object -TypeName PSCustomObject

                ForEach ( $jsonItemKey In ( [HashTable]$InputObject ).Keys )
                {
                    If ( $InputObject[$jsonItemKey] ) { <# Recurse #> $parsedItem = Expand-JsonItem -InputObject $InputObject[$jsonItemKey] }
                    Else { $parsedItem = $null }

                    $return |
                        Add-Member -MemberType NoteProperty -Name $jsonItemKey -Value $parsedItem
                }

                Break
            }

            Default { $return = $InputObject }
        }

        Return $return
    } # End of Process

    End
    {
        #Write-Verbose -Message ( 'Ending {0}.' -f $function )
    } # End of End
} # End of Function