PowerShell 2.0 ConvertFrom-Json 和 ConvertTo-Json 实现

Posted

技术标签:

【中文标题】PowerShell 2.0 ConvertFrom-Json 和 ConvertTo-Json 实现【英文标题】:PowerShell 2.0 ConvertFrom-Json and ConvertTo-Json implementation 【发布时间】:2015-03-20 14:24:23 【问题描述】:

我想对目前无法升级到 3.0 的 PowerShell 2.0 环境进行猴子补丁。

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

我对@9​​87654325@ 最感兴趣,但ConvertTo-Json 也不错。

【问题讨论】:

对于因离题而投票结束的人,我理解你不是。 他/她可能将其视为“脚本命令”,我部分同意。使用 ITIL 术语:这是服务请求(需要脚本),而不是事件(有错误的脚本示例)。 :) @FrodeF.,添加一些关于我的请求的信息,这绝对是一个“脚本顺序”,因为我不想编写一个与 JSON 兼容的版本。我希望有一个可以导入和利用的程序集。我希望猴子补丁问题有一个已知的解决方案,而不是我编写和调试自己的全新脚本。如果这仍然是题外话,我可以把它移到其他地方...... “脚本命令”在这里通常不受欢迎。 *** 是针对特定编程问题的问答,“脚本命令”通常会因为“太宽泛”而关闭。 你可以看看powershelljson.codeplex.com 不过没试过。如果这不起作用,那么您可能需要自己编写一个。您可以编写一个使用 Json.Net 或 Web.Extensions (sample) 的包装器来完成一些工作。 【参考方案1】:
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)

如果您收到错误:

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. "

...可以运行这些注册表命令(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

【讨论】:

这里有一个 ConvertFrom 函数,基于上述。 function ConvertFrom-Json20([object] $item) add-type -assembly system.web.extensions $ps_js=new-object system.web.script.serialization.javascriptSerializer return $ps_js.DeserializeObject($item) 。格式不好,抱歉。 谢谢杰夫!我添加到答案中 如果您没有安装 .NET 3.5,您将收到错误消息:“Add-Type : Could not load file or assembly 'System.Web.Extensions, Version=3.5.0.0, Culture=中性,PublicKeyToken=31bf3856ad364e35 或其依赖项之一。系统找不到指定的文件。" ... 我收到错误Exception calling "Serialize" with "1" argument(s): "A circular reference was detected while serializing an object of type 'System.Management.Automation.PSMethod' 更多信息 - ConvertTo-Json20 无法处理 powershell 对象,如 $obj = New-Object PsObject。你会得到上面的错误。到目前为止,数组已经工作了$arr = @('va1','val2')【参考方案2】:

带有 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】:

稍微改进的选项:

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

return [Object]$result

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于PowerShell 2.0 ConvertFrom-Json 和 ConvertTo-Json 实现的主要内容,如果未能解决你的问题,请参考以下文章

在2.0模式下运行PowerShell终端

powershell 2.0 下载 bootcdn 资源

不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )

无法使用 Powershell 2.0 压缩文件

PowerShell 2.0 ConvertFrom-Json 和 ConvertTo-Json 实现

将SharePoint Online Client组件(Microsoft.SharePoint.Client)与powershell 2.0一起使用