2017-03-03 50 views
1

目前反序列化的枚举的键值对,我正在从一个键值对正确地从下面的结构枚举值。但是,因为它是一个很大的JSON文件,所以我不使用Invoke-RestMethod,因为我相信它是有限的。要绕过这个我用下面的.NET对象PowerShell的 - 当.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    
---  -----    
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] 
+1

为什么不使用'调用-的WebRequest | ConvertFrom-Json'? –

+0

这将与大型JSON文件一起工作吗?其中一些文件大于10 MB。 –

+0

你能告诉我们一个原始JSON的例子吗? – briantist

回答

0

感谢所有那些谁在这个问题上帮助了的。经过一番调查,我发现答案是加入JSON文件和-join“”。例如从上面你需要再反序列化对象,并使用-join “”

例如添加了.NET对象后:

$personnelReport = $jsonserial.DeserializeObject($jsonFile -join '') 
3

ConvertFrom JSON的可以处理大量文件,但它比JavaScriptSerializer它(在57MB以.json文件在这里9秒比3)返回哈希表,不是PS的自定义对象慢〜3倍。

假设JSON是非递归记录像这些的数组:

[ 
    { 
     "age": 28, 
     "sex": "Male" 
    }, 
    { 
     "age": 27, 
     "sex": "Female" 
    }, 
    { 
     "age": 30, 
     "sex": "Male" 
    }, 
    { 
     "age": 32, 
     "sex": "Female" 
    } 
] 

转换它使用[PSCustomObject]型加速器可用自PowerShell的3.0:

$users = foreach ($user in $jsonObject) { [PSCustomObject]$user } 

或在PowerShell 2.0中:

$users = foreach ($user in $jsonObject) { New-Object PSObject -Property $user } 

有了它的大约1.5倍的速度t时的转换韩ConvertFrom-Json。
根据实际数据,可能会直接处理哈希表而无需转换。