wake-up-neo.com

Implementierung von PowerShell 2.0 ConvertFrom-Json und ConvertTo-Json

Ich möchte eine PowerShell 2.0-Umgebung überwachen, in der ein Upgrade auf 3.0 derzeit nicht möglich ist.

Ich suche nach einer PowerShell 2.0-Skriptimplementierung des ConvertFrom-Json-Cmdlets und ConvertTo-Json-Cmdlets, die sich in PowerShell 3.0 befinden.

Ich interessiere mich am meisten für den ConvertFrom-Json, aber ConvertTo-Json wäre auch Nizza.

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

Sie könnten einen Blick auf powershelljson.codeplex.com werfen.

Wenn das nicht funktioniert, müssen Sie wahrscheinlich selbst eine schreiben. Sie könnten einen Wrapper schreiben, der Json.Net oder Web.Extensions ( sample ) verwendet, um die Arbeit zu erledigen.

3
Frode F.

Ich kann den derzeit am besten bewerteten Beitrag über nicht kommentieren. Sie können jedoch diese Registrierungsbefehle ausführen ( weitere 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

damit die oben genannten ConvertTo-Json20- und ConvertTo-Json20-Funktionen funktionieren, wenn der Fehler angezeigt wird:

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

Code mit JavascriptSerializer gibt Objekte mit Dictionary zurück. Modernes convertfrom-JSON (4.0+) gibt nur Objekte zurück. Dieser Code transformiert das Deserialisierungsobjekt in eine moderne Ausgabe :)

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

Ich kann Edwards Antwort oben nicht kommentieren. Ich weiß, dass diese Frage älter ist und die meisten Leute von ihr abgewichen sind, aber ich habe nur eine Menge Zeit damit verbracht, das Problem zu beheben, das von anderen Benutzern bei der Verwendung des obigen ConvertTo-JSON20 festgestellt wurde.

Beim Versuch, eine Liste von Websites aus einer JSON-Datei in eine aktualisierte Liste zu aktualisieren, wurde die folgende Fehlermeldung angezeigt.

"Ausnahme beim Aufrufen von" Serialize "mit" 1 "-Argumenten:" Beim Serialisieren eines Objekts vom Typ "System.Management.Automation.PSMethod" wurde ein Zirkelverweis festgestellt. "

Wenn ich das Array mithilfe von $ array = @ () umwandle, wird das Array als generisches Objekt [] erstellt, wenn Sie das Array jedoch explizit als Zeichenfolge umwandeln (mithilfe von [string []] $ array = @ () ConvertTo) -JSON20 kann die Zeichenfolge in JSON konvertieren.

0
Sean Bulger