json - Powershell:将名称和值数组高性能转换为可解析格式 - 我怎样才能使它更快
问题描述
当我希望从 JSON 有效负载创建一个容易/快速的可解析对象/PSCustomObject 时,如何使我的代码性能更高$JSON
?
我收到的 PAYLOAD 结构的一个示例是:
[
{
"name": "system.enablenetflow",
"value": "false"
},
{
"name": "system.deviceGroupId",
"value": "186,3060"
},
{
"name": "system.prefcollectorid",
"value": "144"
},
{
"name": "system.collectorplatform",
"value": "windows"
}
]
如您所见,它的格式非常烦人。
请注意,我尝试解析的有效负载要大得多,并且数量从 500 个这些名称/值对象到 50000 个不等,而不仅仅是上面列出的 4 个。
################################################# #########################
我的目标
把它变成一个键值对场景,以便以后更容易解析
不是这个:
使用 JSON 我必须做$JSON.where({$_.name -eq "system.enablenetflow"}).value
是的:
我希望最终状态是$obj
我创建的新变量会让我得到值$obj."system.enablenetflow"
################################################# #########################
我目前的尝试非常慢
我做了以下事情:
- 创建一个空 PSCustomObject 并将其保存为变量
$obj
$JSON
对遍历 JSON 数组的变量执行了 foreach 方法- 添加成员
$obj
,将“名称”设置为 PropertyName,将“值”设置为 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
中的输出via也可以加快处理速度。ForEach-Object
PowerShell 允许您将熟悉的点表示法也用于哈希表;因此,例如,在运行上述内容后,您将获得:
PS> $result.'system.collectorplatform'
windows
如果您确实需要$result
成为一个[pscustomobject]
实例,您可以简单地将完全填充的哈希表转换为该类型:
PS> $obj = [pscustomobject] $result; $obj.'system.collectorplatform'
windows
推荐阅读
- sapui5 - 如何更改“dual_stacked_combination”的 VizFrame 颜色
- java - 反转和求和字符串中出现的数字 - java
- reactjs - 使用 useState() 钩子测试功能组件时设置状态
- c++ - 进程返回 -1073741819 (0xC0000005)(为什么??)
- python - 构建网络以检测 CT 扫描中的裂缝
- python - 在 Python 中匹配“类似名称”的字符串
- arrays - 如何过滤我的 Observable 的值?
- sql - 如何根据另一个时间段查询时间段
- c# - 遍历字典键/值对,其中值是一个数组
- c++ - 如何计算预期的核心文件大小