PowerShell 2.0将pscustomobject转换成Json字符串


背景

某哥们用Odata写了一个Web服务作为服务端,客户端需要将PowerShell脚本在机器上扫描的结果以Json格式上传到服务端。

本来 ConvertTo-Json已经很方便了,可是目标操作系统可能是win7或着win 2k8,.NET framework的版本是2.0,PowerShell 的版本2.0,既没有ConvertTo-Json这条命令,也没有直接可以调用的.NET内置的类库。

所以我就写了一个简易版的ConvertToJson函数,可以将pscustomobject或着hashtable对象转换成Json字符串,一般标准的Json字符串应当是有缩进的,这里我只负责上传数据格式的正确性,不负责美观,所以没有实现。

ConvertToJson脚本

#
# Description: Convert custom object to json string
# Author:Mosser Lee (https://www.pstips.net)
#
function  ConvertToJson
{
    param(
    $InputObject
    )
    if( $InputObject -is [string]){
            "`"{0}`"" -f $InputObject

    }
    elseif( $InputObject -is [bool])
    {
        $InputObject.ToString().ToLower()
    }
    elseif( $InputObject-eq $null){
       "null"
    }
    elseif( $InputObject -is [pscustomobject])
    {
        $result = "$space{`n"
        $properties =  $InputObject | Get-Member -MemberType NoteProperty | 
        ForEach-Object {
            "`"{0}`": {1}" -f  $_.Name, (ConvertToJson $InputObject.($_.Name))
        }
        
        $result += $properties -join ",`n"
        $result += "$space`n}"
        $result
    }
    elseif( $InputObject -is [hashtable])
    {
        $result = "{`n"
        $properties =  $InputObject.Keys | 
        ForEach-Object {
            "`"{0}`": {1}" -f  $_, (ConvertToJson $InputObject[$_])
        }
        
        $result += $properties -join ",`n"
        $result += "`n}"
        $result
    }
    elseif( $InputObject -is [array])
    {
        $result = "[`n"
        $items = @()
        for ($i=0;$i -lt $InputObject.length;$i++)
        {
          $items += ConvertToJson $InputObject[$i]
        }
        $result += $items -join ",`n"
        $result += "`n]"
        $result
    } 
    else{
       $InputObject.ToString()
    }
}

测试

整数,浮点
PS> ConvertToJson 2
2
PS> ConvertToJson 3.14
3.14
字符串
PS> ConvertToJson '2'
"2"
布尔
PS> ConvertToJson $true
true
哈希表
PS> ConvertToJson @{A=3;B=4}
{
"A": 3,
"B": 4
}
数组
PS> ConvertToJson @('PStips.NET','PowerShell',3)
[
"PStips.NET",
"PowerShell",
3
]
复合对象
$obj = [pscustomobject]@{
A = 3
B = '4'
C = $false
D = 20,'40',$true,@{
 网站类型="博客"
 域名="www.pstips.net"
 年龄=30
}
}  

ConvertToJson $obj

输出:

{
"A": 3,
"B": "4",
"C": false,
"D": [
20,
"40",
true,
{
"网站类型": "博客",
"域名": "www.pstips.net",
"年龄": 30
}
]
}
本文链接: https://www.pstips.net/convert-pscustomobject-to-json.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注