Powershell:将名称和值数组高效转换为可解析格式-如何使其更快?



当我希望从JSON有效负载$JSON中创建一个易于/快速可解析的对象/PSCustomObject时,我如何使我的代码更高效?

我收到的PAYLOAD结构的一个例子是:
[
{
"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"的值

###########################################################################

我当前的尝试是超级慢的

我做了以下操作:

  1. 创建一个空的PSCustomObject并保存为变量$obj
  2. 对通过JSON数组迭代的$JSON变量执行foreach方法
  3. $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

最新更新