Last active
March 12, 2021 09:24
-
-
Save nichollsc81/66aa3ca789ecc0966c847f43b9d5cf62 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### load functions region | |
function Format-Json | |
{ | |
<# | |
.SYNOPSIS | |
Prettifies JSON output. | |
.DESCRIPTION | |
Reformats a JSON string so the output looks better than what ConvertTo-Json outputs. | |
.PARAMETER Json | |
Required: [string] The JSON text to prettify. | |
.PARAMETER Minify | |
Optional: Returns the json string compressed. | |
.PARAMETER Indentation | |
Optional: The number of spaces (1..1024) to use for indentation. Defaults to 4. | |
.PARAMETER AsArray | |
Optional: If set, the output will be in the form of a string array, otherwise a single string is output. | |
.EXAMPLE | |
$json | ConvertTo-Json | Format-Json -Indentation 2 | |
#> | |
[CmdletBinding(DefaultParameterSetName = 'Prettify')] | |
Param( | |
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] | |
[string]$Json, | |
[Parameter(ParameterSetName = 'Minify')] | |
[switch]$Minify, | |
[Parameter(ParameterSetName = 'Prettify')] | |
[ValidateRange(1, 1024)] | |
[int]$Indentation = 4, | |
[Parameter(ParameterSetName = 'Prettify')] | |
[switch]$AsArray | |
) | |
if ($PSCmdlet.ParameterSetName -eq 'Minify') | |
{ | |
return ($Json | ConvertFrom-Json) | ConvertTo-Json -Depth 100 -Compress | |
} | |
# If the input JSON text has been created with ConvertTo-Json -Compress | |
# then we first need to reconvert it without compression | |
if ($Json -notmatch '\r?\n') | |
{ | |
$Json = ($Json | ConvertFrom-Json) | ConvertTo-Json -Depth 100 | |
} | |
$indent = 0 | |
$regexUnlessQuoted = '(?=([^"]*"[^"]*")*[^"]*$)' | |
$result = $Json -split '\r?\n' | | |
ForEach-Object { | |
# If the line contains a ] or } character, | |
# we need to decrement the indentation level unless it is inside quotes. | |
if ($_ -match "[}\]]$regexUnlessQuoted") | |
{ | |
$indent = [Math]::Max($indent - $Indentation, 0) | |
} | |
# Replace all colon-space combinations by ": " unless it is inside quotes. | |
$line = (' ' * $indent) + ($_.TrimStart() -replace ":\s+$regexUnlessQuoted", ': ') | |
# If the line contains a [ or { character, | |
# we need to increment the indentation level unless it is inside quotes. | |
if ($_ -match "[\{\[]$regexUnlessQuoted") | |
{ | |
$indent += $Indentation | |
} | |
$line | |
} | |
if ($AsArray) | |
{ | |
return $result | |
} | |
return $result -Join [Environment]::NewLine | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment