PowerShell - 在.NET对象反序列化时枚举键值对

时间:2017-03-03 20:04:08

标签: .net json powershell

目前,我正在从下面的结构中正确地使用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]

2 个答案:

答案 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 '')