我想要修补一个PowerShell 2.0环境,此时升级到3.0是不可能的。
我正在寻找一个PowerShell 2.0脚本实现的ConvertFrom-Json cmdlet和ConvertTo-Json cmdlet是在PowerShell 3.0。
我最感兴趣的是ConvertFrom-Json,不过ConvertTo-Json也不错。
发布于 2015-04-17 11:21:18
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发布于 2018-09-28 19:23:29
使用javascriptSerializer的代码返回内部带有字典的对象。现代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
}发布于 2021-11-25 17:01:52
稍微改进了一下选项:
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}
https://stackoverflow.com/questions/28077854
复制相似问题