ConvertFrom-JsonAsHashtable.psm1
function ConvertFrom-JsonAsHashtable { param( [Parameter(ValueFromPipeline = $true)] $InputObject ) begin { $buffer = [System.Text.StringBuilder]::new() } process { if ($InputObject -is [array]) { $null = $buffer.Append(($InputObject -join "`n")) } else { $null = $buffer.Append($InputObject) } } end { $jsonString = $buffer.ToString() if ($PSVersionTable.PSVersion.Major -ge 7) { return $jsonString | ConvertFrom-Json -AsHashtable } $jsonString = [regex]::Replace($jsonString, '(?<!\\)"\s*"\s*:', { param($m) '"emptyKey_' + [Guid]::NewGuid() + '":' }) $jsonString = [regex]::Replace($jsonString, ',\s*(?=[}\]]\s*$)', '') function ProcessArray { param($array) $nestedArr = [System.Collections.ArrayList]::new() foreach ($item in $array) { if ($item -is [System.Collections.IEnumerable] -and $item -isnot [string]) { $null = $nestedArr.Add((ProcessArray $item)) } elseif ($item -is [System.Management.Automation.PSCustomObject]) { $null = $nestedArr.Add((ConvertToHashtable $item)) } else { $null = $nestedArr.Add($item) } } return $nestedArr } function ConvertToHashtable { param($obj) if ($obj -is [Array]) { return @($obj | ForEach-Object { ConvertToHashtable $_ }) } elseif ($obj -is [PSCustomObject]) { $h = @{} foreach ($prop in $obj.PSObject.Properties) { $h[$prop.Name] = ConvertToHashtable $prop.Value } return $h } else { return $obj } } ConvertToHashtable ($jsonString | ConvertFrom-Json) } } Export-ModuleMember -Function ConvertFrom-JsonAsHashtable |