当我希望从JSON有效负载$JSON
中创建一个易于/快速可解析的对象/PSCustomObject时,我如何使我的代码更高效?
[
{
"name": "system.enablenetflow",
"value": "false"
},
{
"name": "system.deviceGroupId",
"value": "186,3060"
},
{
"name": "system.prefcollectorid",
"value": "144"
},
{
"name": "system.collectorplatform",
"value": "windows"
}
]
你可以看到它的格式很烦人。
请注意,我尝试解析的有效负载要大得多,并且这些Name/Value对象的数量从500个到50000个不等,而不仅仅是上面列出的4个。
###########################################################################
我的目标
将其转换为键:值对场景,以便以后更容易解析
不是这个:
JSON则是$JSON.where({$_.name -eq "system.enablenetflow"}).value
对:
我希望最终状态是我创建的新变量$obj
将让我获得$obj."system.enablenetflow"
的值
###########################################################################
我当前的尝试是超级慢的
我做了以下操作:
- 创建一个空的PSCustomObject并保存为变量
$obj
- 对通过JSON数组迭代的
$JSON
变量执行foreach方法 - 在
$obj
中添加成员,将'name'设置为PropertyName, 'value'设置为PropertyValue
下面是我的代码示例:
$obj = [PSCustomObject] @{}
$json.foreach({
$thisitem = $_
$obj | Add-member -NotePropertyName $($thisitem.name) -NotePropertyValue $($thisitem.name)
})
我怎样才能使它更快?
# Sample input JSON.
$json = @'
[
{
"name": "system.enablenetflow",
"value": "false"
},
{
"name": "system.deviceGroupId",
"value": "186,3060"
},
{
"name": "system.prefcollectorid",
"value": "144"
},
{
"name": "system.collectorplatform",
"value": "windows"
}
]
'@
# Initialize the (ordered) result hashtable.
$result = [ordered] @{}
# Note: In PowerShell (Core) 7+, add -AsHashTable to the ConvertFrom-Json
# call for additional performance gain, combined with -AsArray,
# in which case you don't need the `(...)` around the call anymore.
foreach ($element in (ConvertFrom-Json $json)) {
$result[$element.name] = $element.value
}
上面的代码创建了一个(有序)哈希表而不是[pscustomobject]
实例——特别是如果后者是通过Add-Member
调用迭代地构造的。
哈希表比[pscustomobject]
实例更轻量,构建速度更快。
使用foreach
循环而不是通过ForEach-Object
在管道中处理ConvertFrom-Json
输出也加快了处理速度。
PowerShell允许您使用熟悉的点表示法也哈希表;因此,例如,运行上述命令后,您将得到:
PS> $result.'system.collectorplatform'
windows
如果您确实需要$result
成为[pscustomobject]
实例,您可以简单地将完全填充的哈希表强制转换为该类型:
PS> $obj = [pscustomobject] $result; $obj.'system.collectorplatform'
windows