PowerShell中用foreach循环解析JSON生成精简文件报错求助
问题分析与解决方案
你的代码存在几个关键问题导致循环报错:
- 错误的迭代对象:你尝试遍历
$jsonInput.PSObject.Properties,但$jsonInput是原始JSON字符串,不是解析后的对象。应该遍历$inputObj.vulnerabilities.PSObject.Properties,这才是包含各个漏洞包的集合。 - 无效的哈希表语法:在
[pscustomobject]@{}内部直接写foreach循环是PowerShell不支持的语法,无法动态生成键值对。 - 冗余的属性获取:使用
Get-Member获取属性是多余的,直接通过迭代对象的Value属性即可访问漏洞详情。 - 动态键赋值错误:
'$($property.Name)' = ...的写法无法正确解析动态键名,应该通过哈希表先收集键值对,再转换为自定义对象。
修正后的代码
$jsonInput=@" { "auditReportVersion": 2, "vulnerabilities": { "@babel/traverse": { "name": "@babel/traverse", "severity": "critical", "isDirect": false, "via": [ { "source": 1094446, "name": "@babel/traverse", "dependency": "@babel/traverse", "title": "Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code", "url": "https://github.com/advisories/GHSA-67hx-6x53-jw92", "severity": "critical", "cwe": [ "CWE-184", "CWE-697" ], "cvss": { "score": 9.3, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H" }, "range": "<7.23.2" } ], "effects": [], "range": "<7.23.2", "nodes": [ "node_modules/@babel/traverse" ], "fixAvailable": true } } }"@ $inputObj = $jsonInput | ConvertFrom-Json # 初始化哈希表存储处理后的漏洞数据 $processedVulnerabilities = @{} # 遍历每个漏洞包 foreach ($vulnProperty in $inputObj.vulnerabilities.PSObject.Properties) { $vulnDetails = $vulnProperty.Value # 提取指定字段生成精简对象 $trimmedVuln = [pscustomobject]@{ name = $vulnDetails.name severity = $vulnDetails.severity range = $vulnDetails.range fixAvailable = $vulnDetails.fixAvailable } # 将精简对象添加到哈希表,键为包名 $processedVulnerabilities[$vulnProperty.Name] = $trimmedVuln } # 构建最终输出对象 $outputObj = [pscustomobject]@{ auditReportVersion = $inputObj.auditReportVersion vulnerabilities = [pscustomobject]$processedVulnerabilities } # 转换为JSON并保存 $outputObj | ConvertTo-Json -Depth 4 | Out-File .\trimmed_vulnerabilities.json
关键修改说明
- 遍历正确的对象:通过
$inputObj.vulnerabilities.PSObject.Properties获取所有漏洞包的属性集合,每个属性的Name是包名(如@babel/traverse),Value是该包的漏洞详情。 - 使用哈希表收集动态键值对:先创建空哈希表,在循环中逐个添加处理后的漏洞对象,最后将哈希表转换为自定义对象赋值给
vulnerabilities字段。 - 直接提取所需字段:从每个漏洞详情对象中直接读取
name、severity等字段,无需额外的属性查找操作,代码更简洁高效。 - 正确的JSON深度设置:使用
-Depth 4确保转换为JSON时不会丢失嵌套结构。
内容的提问来源于stack exchange,提问作者simon farande
相关产品推荐
相关产品推荐

