-
-
Save mdnmdn/6936714 to your computer and use it in GitHub Desktop.
function Escape-JSONString($str){ | |
if ($str -eq $null) {return ""} | |
$str = $str.ToString().Replace('"','\"').Replace('\','\\').Replace("`n",'\n').Replace("`r",'\r').Replace("`t",'\t') | |
return $str; | |
} | |
function ConvertTo-JSON($maxDepth = 4,$forceArray = $false) { | |
begin { | |
$data = @() | |
} | |
process{ | |
$data += $_ | |
} | |
end{ | |
if ($data.length -eq 1 -and $forceArray -eq $false) { | |
$value = $data[0] | |
} else { | |
$value = $data | |
} | |
if ($value -eq $null) { | |
return "null" | |
} | |
$dataType = $value.GetType().Name | |
switch -regex ($dataType) { | |
'String' { | |
return "`"{0}`"" -f (Escape-JSONString $value ) | |
} | |
'(System\.)?DateTime' {return "`"{0:yyyy-MM-dd}T{0:HH:mm:ss}`"" -f $value} | |
'Int32|Double' {return "$value"} | |
'Boolean' {return "$value".ToLower()} | |
'(System\.)?Object\[\]' { # array | |
if ($maxDepth -le 0){return "`"$value`""} | |
$jsonResult = '' | |
foreach($elem in $value){ | |
#if ($elem -eq $null) {continue} | |
if ($jsonResult.Length -gt 0) {$jsonResult +=', '} | |
$jsonResult += ($elem | ConvertTo-JSON -maxDepth ($maxDepth -1)) | |
} | |
return "[" + $jsonResult + "]" | |
} | |
'(System\.)?Hashtable' { # hashtable | |
$jsonResult = '' | |
foreach($key in $value.Keys){ | |
if ($jsonResult.Length -gt 0) {$jsonResult +=', '} | |
$jsonResult += | |
@" | |
"{0}": {1} | |
"@ -f $key , ($value[$key] | ConvertTo-JSON -maxDepth ($maxDepth -1) ) | |
} | |
return "{" + $jsonResult + "}" | |
} | |
default { #object | |
if ($maxDepth -le 0){return "`"{0}`"" -f (Escape-JSONString $value)} | |
return "{" + | |
(($value | Get-Member -MemberType *property | % { | |
@" | |
"{0}": {1} | |
"@ -f $_.Name , ($value.($_.Name) | ConvertTo-JSON -maxDepth ($maxDepth -1) ) | |
}) -join ', ') + "}" | |
} | |
} | |
} | |
} | |
#"a" | ConvertTo-JSON | |
#dir \ | ConvertTo-JSON | |
#(get-date) | ConvertTo-JSON | |
#(dir \)[0] | ConvertTo-JSON -maxDepth 1 | |
#@{ "asd" = "sdfads" ; "a" = 2 } | ConvertTo-JSON |
It seems to me that line 36 doesn't support enough numeric types. I prefer to remove lines 36 and 37 and insert these two lines at line 30, instead:
if ($value.GetType().Name -eq 'Boolean') {return "$value".ToLower()}
if ($value.GetType().IsPrimitive) {return "$value"}
This is crap. For a solution from a superior mind, see https://github.com/EliteLoser/ConvertTo-Json - but thanks for sharing.
Hello
how can i remove \t in json?
{\t"id": "63304D56-6A42-43DB-7670-B73FD8389E6", \t"type": "Hello"}
why you skipped "|UInt64|UInt16" in row "'Int32|Double' {return "$value"}"?
without adding it, this results to generate different json than if we use ms convertto-json commandlet
for example if we use
$Disks= @(Get-WmiObject Win32_DiskDrive | Select-Object -Property Caption, Partitions, Size)
$Volumes= @(Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -ne 4 } | Select-Object -Property DeviceID, Size, FreeSpace)
does anyone know if there's a convertfrom-json implementation just like this one?