Mic*_*ppe 7 powershell json powershell-2.0 javascriptserializer
我在powershell 2.0中编写脚本,目前无法升级到3.0或更高版本.在这个脚本中,我尝试使用此链接中的代码将一些数据序列化为JSON(PowerShell 2.0 ConvertFrom-Json和ConvertTo-Json实现):
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)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我以某种方式获得循环引用,我真的不知道为什么.我设置了一小段测试数据,结构在powershell中看起来像这样:
$testRoot = @{
"id" = "1"
"children" = @(
@{
"id" = "2"
"children" = @(
@{
"id" = "2";
};
@{
"id" = "3";
}
);
};
@{
"id" = "4"
"children" = @(
@{
"id" = "5";
}
);
}
)
}
Run Code Online (Sandbox Code Playgroud)
我知道它看起来很垃圾,但我只需要这种格式.
我需要序列化的结构有更多的层,所以更多的"孩子",并有它变得奇怪的点.
当我尝试这个:
ConvertTo-Json20 $testRoot
Run Code Online (Sandbox Code Playgroud)
一切正常.结构被解析如下:
{
"id":"1",
"children":[
{
"id":"2",
"children":[
{
"id":"2"
},
{
"id":"3"
}
]
},
{
"id":"4",
"children":[
{
"id":"5"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
但现在出现了问题.如上所述,结构有更多的层,所以我尝试这只是在数组中设置数据.
ConvertTo-Json20 @($testRoot)
Run Code Online (Sandbox Code Playgroud)
但它不起作用我只是收到一条错误消息说:
Exception in method "Serialize" with 1 argument(s):
"While serializing an object of type "System.Management.Automation.PSParameterizedProperty" a circular reference was discovered."
At C:\Users\a38732\Desktop\Temp.ps1:34 symbol:28
+ return $ps_js.Serialize <<<< ($item)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Run Code Online (Sandbox Code Playgroud)
(我翻译了德语的错误信息,所以在英文版中可能会有一些不同的词......)
一个问题是类本身的使用JavaScriptSerializer
。截至目前,文档本身承认不应将其用于序列化或反序列化 JSON。去引用:
Json.NET应该使用序列化和反序列化。
如果您能够使用Json.NET等第三方库,那么这里有一个简单的函数,可以根据 OP 中的数据结构完成您所需的操作:
function ConvertTo-JsonNet {
[CmdletBinding()]
param(
[Parameter(Mandatory)] $object,
[Parameter(Mandatory)] [string]$jsonNetPath,
[switch]$indent,
[switch]$preserveReferencesHandling
)
Add-Type -Path $jsonNetPath;
$formatting = if ($indent.IsPresent) { [Newtonsoft.Json.Formatting]::Indented; }
else { [Newtonsoft.Json.Formatting]::None; }
$settings = New-Object Newtonsoft.Json.JsonSerializerSettings;
if ($preserveReferencesHandling.IsPresent) {
$settings.PreserveReferencesHandling = [Newtonsoft.Json.PreserveReferencesHandling]::Objects;
}
[Newtonsoft.Json.JsonConvert]::SerializeObject($object, $formatting, $settings);
}
Run Code Online (Sandbox Code Playgroud)
简单用法,假设Newtonsoft.Json.dll
与您的脚本位于同一目录中:
$dllPath = Join-Path $PSScriptRoot 'Newtonsoft.Json.dll';
ConvertTo-JsonNet @($testRoot) $dllPath;
Run Code Online (Sandbox Code Playgroud)
输出:
[{"id":"1","children":[{"id":"2","children":[{"id":"2"},{"id":"3"}]},{"id":"4","children":[{"id":"5"}]}]}]
Run Code Online (Sandbox Code Playgroud)
您可以从nuget 包项目站点手动下载 .dll 。它有一个.nupkg
文件扩展名,但它是一个压缩存档,因此将扩展名重命名为.zip
即可。该子目录中lib
包含 .NET 版本 2.0 到 4.5 的 .dll 文件。
归档时间: |
|
查看次数: |
486 次 |
最近记录: |