目前,我正在从下面的结构中正确地使用Key Value对中的枚举器值。但是,因为它是如此庞大的JSON文件,所以我不使用Invoke-RestMethod,因为我认为它是有限的。为了绕过这个,我使用了以下.NET对象
System.Web.Script.Serialization.JavaScriptSerializer
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions')
$jsonserial= New-Object -TypeName System.Web.Script.Serialization.JavaScriptSerializer
$jsonserial.MaxJsonLength = 67108864
这个问题是我被提供了我没有很多经验的Key-Value Pairs。因此,我得到了一个不受欢迎的结构。
我得到的结果如下:
Key Value
--- -----
age 28
sex Male
age 27
sex Female
age 30
sex Male
age 32
sex Female
这是我想要完成的事情:
Age Sex
--- ---
28 Male
27 Female
30 Male
32 Female
我尝试使用foreach语句枚举对象
$jsonObject |
ForEach-Object {
foreach ($p in $_.PSObject.Properties)
{
$p.Value
}
} | Format-Table
但我的回答是这样的:
System.Collections.Generic.GenericEqualityComparer`1[System.String]
2
age
sex
28
Male
False
False
System.Object
False
System.Collections.Generic.GenericEqualityComparer`1[System.String]
答案 0 :(得分:3)
ConvertFrom-Json可以处理大文件,但它比返回哈希表的JavaScriptSerializer慢3倍,而不是PS自定义对象(这里57MB .json文件上9秒对3)。
假设JSON是一个非递归记录数组,如下所示:
[
{
"age": 28,
"sex": "Male"
},
{
"age": 27,
"sex": "Female"
},
{
"age": 30,
"sex": "Male"
},
{
"age": 32,
"sex": "Female"
}
]
使用自PowerShell 3.0以来可用的[PSCustomObject]
类型加速器转换它:
$users = foreach ($user in $jsonObject) { [PSCustomObject]$user }
或在PowerShell 2.0中:
$users = foreach ($user in $jsonObject) { New-Object PSObject -Property $user }
通过转换,它比ConvertFrom-Json快1.5倍 根据实际数据,可以直接处理哈希表而无需转换。
答案 1 :(得分:0)
感谢所有帮助解决此问题的人。经过一些研究,我发现答案是用-join""加入JSON文件。例如,从上面添加.NET对象后,您需要反序列化该对象并使用-join""
示例:强>
$personnelReport = $jsonserial.DeserializeObject($jsonFile -join '')