it-swarm.com.ru

Реализация PowerShell 2.0 ConvertFrom-Json и ConvertTo-Json

Я хотел бы установить патч PowerShell 2.0, в котором в настоящее время обновление до 3.0 невозможно.

Я ищу реализацию сценария PowerShell 2.0 для командлета ConvertFrom-Json и командлета ConvertTo-Json, которые есть в PowerShell 3.0.

Меня больше всего интересует ConvertFrom-Json, но ConvertTo-Json также будет хорошим.

15
Josh Petitt
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)
}
37
Edward

Вы можете взглянуть на powershelljson.codeplex.com Хотя никогда не пробовал.

Если это не сработает, то вам, вероятно, придется написать его самостоятельно. Вы могли бы написать оболочку, которая использует Json.Net или Web.Extensions ( sample ) для выполнения некоторой работы.

3
Frode F.

Я не могу комментировать в настоящее время пост с самым высоким рейтингом выше , однако вы можете запустить эти команды реестра ( более подробно ):

   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-Json20 и ConvertTo-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. "
1
user157183

Код с 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
}
0
Artem Mikryukov