Powershell:名称和值数组到可解析格式的高性能转换——我怎样才能让它更快
Powershell: High Performing conversion of Name and Value Array into Parseable format - How can I make this Faster
当我希望从 JSON 有效负载 $JSON
中生成 easily/fast 可解析 object/PSCustomObject 时,如何使我的代码性能更高?
我收到的 PAYLOAD 的结构示例是:
[
{
"name": "system.enablenetflow",
"value": "false"
},
{
"name": "system.deviceGroupId",
"value": "186,3060"
},
{
"name": "system.prefcollectorid",
"value": "144"
},
{
"name": "system.collectorplatform",
"value": "windows"
}
]
如您所见,它的格式非常烦人。
请注意,我尝试解析的有效负载要大得多,而且数量从 500 个 Name/Value 对象到 50000 个不等,而不仅仅是上面列出的 4 个。
########################################### ##############################
我的目标
将此变成 key:value 对场景以便以后更容易解析
不是这个:
有了 JSON 我必须做 $JSON.where({$_.name -eq "system.enablenetflow"}).value
是这个:
我希望最终状态是我创建的新变量 $obj
将让我获得 $obj."system.enablenetflow"
的值
########################################### ##############################
我目前的尝试超级慢
我做了以下事情:
- 创建一个空的 PSCustomObject 并将其保存为变量
$obj
- 在
$JSON
变量上使用 foreach 方法迭代 JSON 数组
- 将成员添加到
$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
循环而不是处理 ConvertFrom-Json
output in a pipeline via ForEach-Object
也可以加快处理速度。
PowerShell 允许您对哈希表也使用熟悉的点符号;所以,例如,在上面的 运行 之后,你会得到:
PS> $result.'system.collectorplatform'
windows
如果您确实需要 $result
成为 [pscustomobject]
实例,您可以简单地将完全填充的哈希表转换为该类型:
PS> $obj = [pscustomobject] $result; $obj.'system.collectorplatform'
windows
当我希望从 JSON 有效负载 $JSON
中生成 easily/fast 可解析 object/PSCustomObject 时,如何使我的代码性能更高?
我收到的 PAYLOAD 的结构示例是:
[
{
"name": "system.enablenetflow",
"value": "false"
},
{
"name": "system.deviceGroupId",
"value": "186,3060"
},
{
"name": "system.prefcollectorid",
"value": "144"
},
{
"name": "system.collectorplatform",
"value": "windows"
}
]
如您所见,它的格式非常烦人。
请注意,我尝试解析的有效负载要大得多,而且数量从 500 个 Name/Value 对象到 50000 个不等,而不仅仅是上面列出的 4 个。
########################################### ##############################
我的目标
将此变成 key:value 对场景以便以后更容易解析
不是这个:
有了 JSON 我必须做 $JSON.where({$_.name -eq "system.enablenetflow"}).value
是这个:
我希望最终状态是我创建的新变量 $obj
将让我获得 $obj."system.enablenetflow"
########################################### ##############################
我目前的尝试超级慢
我做了以下事情:
- 创建一个空的 PSCustomObject 并将其保存为变量
$obj
- 在
$JSON
变量上使用 foreach 方法迭代 JSON 数组 - 将成员添加到
$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
循环而不是处理 ConvertFrom-Json
output in a pipeline via ForEach-Object
也可以加快处理速度。
PowerShell 允许您对哈希表也使用熟悉的点符号;所以,例如,在上面的 运行 之后,你会得到:
PS> $result.'system.collectorplatform'
windows
如果您确实需要 $result
成为 [pscustomobject]
实例,您可以简单地将完全填充的哈希表转换为该类型:
PS> $obj = [pscustomobject] $result; $obj.'system.collectorplatform'
windows