首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell 2.0 ConvertFrom-Json和ConvertTo-Json的实现

PowerShell 2.0 ConvertFrom-Json和ConvertTo-Json的实现
EN

Stack Overflow用户
提问于 2015-01-22 06:15:04
回答 3查看 26.8K关注 0票数 20

我想要修补一个PowerShell 2.0环境,此时升级到3.0是不可能的。

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

我最感兴趣的是ConvertFrom-Json,不过ConvertTo-Json也不错。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-17 11:21:18

代码语言:javascript
复制
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)
}

如果你得到这个错误:

代码语言:javascript
复制
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):

代码语言:javascript
复制
   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
票数 45
EN

Stack Overflow用户

发布于 2018-09-28 19:23:29

使用javascriptSerializer的代码返回内部带有字典的对象。现代convertfrom-JSON (4.0+)只返回对象。此代码将反序列化对象转换为现代输出:)

代码语言:javascript
复制
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
}
票数 0
EN

Stack Overflow用户

发布于 2021-11-25 17:01:52

稍微改进了一下选项:

代码语言:javascript
复制
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

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28077854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档