Je voudrais monkeypatch un environnement PowerShell 2.0 où la mise à niveau vers la version 3.0 n'est pas possible pour le moment.
Je recherche une implémentation de script PowerShell 2.0 de la cmdlet ConvertFrom-Json
et de la cmdlet ConvertTo-Json
qui se trouvent dans PowerShell 3.0.
Je suis plus intéressé par le ConvertFrom-Json
, mais ConvertTo-Json
serait également agréable.
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)
}
Vous pouvez jeter un oeil à powershelljson.codeplex.com Je n'ai jamais essayé.
Si cela ne fonctionne pas, vous devrez probablement en écrire un vous-même. Vous pouvez écrire un wrapper utilisant Json.Net ou Web.Extensions ( sample ) pour effectuer une partie du travail.
Je ne parviens pas à commenter le message actuellement le mieux noté ci-dessus , mais vous pouvez exécuter ces commandes de registre ( plus de détails ):
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
pour permettre aux fonctions ConvertTo-Json20
et ConvertTo-Json20
ci-dessus de fonctionner si vous obtenez le message d'erreur:
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. "
Le code avec javascriptSerializer renvoie des objets avec un dictionnaire à l'intérieur. Convertfrom-JSON (4.0+) moderne ne renvoie que des objets. Ce code transforme l'objet désérialisé en sortie moderne :)
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
}