如何删除JSON文件中包含指定字符串的整个节点?
问题:删除JSON中指定id的整个节点
原始JSON内容
{ "JSONS" : [ { "id" : "ToRemove", "First" : [ { "id" : "geo", "Name" : "Person1", "model" : [ ], "adjustments" : [ { "uid" : "3", "name" : "4s", "value" : "1" }, { "uid" : "5", "name" : "3s", "value" : "6" } ] }, { "id" : "Meters", "Dictionary" : "4.2" }, { "id" : "Moon", "Filter" : "0.5", "Saturn" : { "s" : "0", "v" : "1" } } ] } ] }
需求说明
需要删除所有id属性包含指定字符串(如示例中的"ToRemove")的整个节点,同时支持通过数组指定多个需要匹配删除的字符串,处理后保持JSON格式正确。
尝试的错误代码
$ToRemove = Get-Content $SourceFile | ConvertFrom-Json $ToRemove.PSObject.Object.Remove('id:','ToRemove') $ToRemove | ConvertTo-Json -Depth 100 | Out-File $DestFile
该代码无法正常工作,因为PSObject.Object.Remove仅用于删除对象的单个属性,而非数组中的整个节点。
解决方案
正确的PowerShell代码
# 定义需要匹配删除的id字符串数组,可添加多个目标字符串 $removeIds = @("ToRemove", "AnotherTargetId") # 读取源JSON文件(-Raw参数确保读取完整的JSON内容) $jsonContent = Get-Content $SourceFile -Raw | ConvertFrom-Json # 过滤JSONS数组,保留id不包含指定字符串的节点 $jsonContent.JSONS = $jsonContent.JSONS | Where-Object { $currentId = $_.id $keepNode = $true # 遍历所有需要删除的字符串,检查当前节点id是否包含目标字符串 foreach ($removeStr in $removeIds) { if ($currentId -like "*$removeStr*") { $keepNode = $false break } } $keepNode } # 将处理后的对象转换回JSON并保存(-Depth 100避免嵌套层级截断,-Encoding UTF8保证编码正确) $jsonContent | ConvertTo-Json -Depth 100 | Out-File $DestFile -Encoding UTF8
代码说明
- 定义删除列表:
$removeIds数组可添加任意多个需要匹配的字符串,只要节点的id包含其中任意一个,就会被删除。 - 读取JSON:使用
-Raw参数读取文件,避免因换行导致JSON转换失败。 - 过滤节点:通过
Where-Object遍历JSONS数组,对每个节点的id进行包含匹配,仅保留不需要删除的节点。 - 保存结果:转换回JSON时指定
-Depth 100,防止深层嵌套的JSON结构被截断;-Encoding UTF8确保输出文件编码正确。
内容的提问来源于stack exchange,提问作者KolesGit
相关产品推荐
相关产品推荐

