PowerShell 2.0 ConvertFrom-Json和ConvertTo-Json实现

时间:2015-01-21 22:15:04

标签: json powershell powershell-v2.0

我想monkeypatch PowerShell 2.0环境,目前无法升级到3.0。

我正在寻找PowerShell 3.0中ConvertFrom-Json cmdlet和ConvertTo-Json cmdlet的PowerShell 2.0脚本实现。

我对ConvertFrom-Json最感兴趣,但ConvertTo-Json也不错。

4 个答案:

答案 0 :(得分:39)

function ConvertTo-Json20([object] $item){
    add-type -assembly system.web.extensions
    $ps_js=new-object system.web.script.serialization.javascriptSerializer
    return $ps_js.Serialize($item)
}

function ConvertFrom-Json20([object] $item){ 
    add-type -assembly system.web.extensions
    $ps_js=new-object system.web.script.serialization.javascriptSerializer

    #The comma operator is the array construction operator in PowerShell
    return ,$ps_js.DeserializeObject($item)
}

答案 1 :(得分:1)

我无法评论currently top rated post above,但您可以运行这些注册表命令(more details):

   reg add hklm\software\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1 /f
   reg add hklm\software\wow6432node\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1 /f

如果您收到错误,则允许上述ConvertTo-Json20ConvertTo-Json20功能正常工作:

Add-Type : Could not load file or assembly 'System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 or one of its dependencies. The system cannot find the file specified. "

答案 2 :(得分:0)

带有javascriptSerializer的代码返回对象,其中包含Dictionary。现代的convertfrom-JSON(4.0+)仅返回对象。这段代码将反序列化的对象转换为现代输出:)

function Iterate-Tree($jsonTree) {
    $result = @()
    foreach ($node in $jsonTree) {
        $nodeObj = New-Object psobject
        foreach ($property in $node.Keys) {
            if ($node[$property] -is [System.Collections.Generic.Dictionary[String, Object]] -or $node[$property] -is [Object[]]) {
                $inner = @()
                $inner += Iterate-Tree $node[$property]
                $nodeObj  | Add-Member -MemberType NoteProperty -Name $property -Value $inner
            } else {
                $nodeObj  | Add-Member -MemberType NoteProperty -Name $property -Value $node[$property]
                #$nodeHash.Add($property, $node[$property])
            }
        }
        $result += $nodeObj
    }
    return $result
}

function ConvertFrom-Json20{ 
    [cmdletbinding()]
    Param (
        [parameter(ValueFromPipeline=$true)][object] $PS_Object
    )

    add-type -assembly system.web.extensions
    $PS_JavascriptSerializer=new-object system.web.script.serialization.javascriptSerializer
    $PS_DeserializeObject = ,$PS_JavascriptSerializer.DeserializeObject($PS_Object) 

    #Convert Dictionary to Objects
    $PS_DeserializeObject = Iterate-Tree $PS_DeserializeObject

    return $PS_DeserializeObject
}

答案 3 :(得分:0)

我无法评论爱德华的上述回答。我知道这个问题比较老,而且大多数人都已经放弃了,但是我花了很多时间试图纠正使用上面的ConvertTo-JSON20时其他用户看到的问题。

当尝试将站点列表从JSON文件更新为更新列表时,我收到以下错误。

“使用” 1“参数调用” Serialize“的异常:”序列化类型为'System.Management.Automation.PSMethod'的对象时检测到循环引用”

当我使用$ array = @()转换数组时,它将创建数组作为通用Object [],但是,如果您将数组显式转换为字符串(通过使用[string []] $ array = @ ()ConvertTo-JSON20能够将字符串转换为JSON。