如何使用jq删除键包含指定子串的JSON元素?
筛选JSON数组中键不含指定字符串的元素
问题描述
我有如下JSON数据:
{ "Category": [ { "SomeKey_1": { "Property1": 1, "Property2": false } }, { "SomeKey_2": { "Property1": 2, "Property2": true } }, { "OtherKey_1": { "Property1": 3, "Property2": false } }, { "OtherKey_2": { "Property1": 4, "Property2": false } } ] }
需要从Category数组中删除所有键包含"Other"的元素,最终得到仅保留SomeKey开头元素的JSON结果。尝试过Select命令,但它只能基于值筛选,无法处理键的判断。
解决方案
方案1:PowerShell实现
利用PowerShell的对象操作能力,通过Where-Object过滤元素,检查对象的键名是否符合要求:
# 假设原始JSON字符串存储在$jsonStr变量中(也可通过Get-Content从文件读取) $jsonObj = $jsonStr | ConvertFrom-Json # 筛选Category数组,保留键不含"Other"的元素 $jsonObj.Category = $jsonObj.Category | Where-Object { -not ($_.PSObject.Properties.Name -match 'Other') } # 转换回JSON格式输出,-Depth确保嵌套层级完整 $jsonObj | ConvertTo-Json -Depth 3
关键说明:
$_.PSObject.Properties.Name获取当前数组元素的所有键名-match 'Other'检测键名是否包含目标字符串,-not取反后保留符合条件的元素-Depth 3避免JSON转换时截断嵌套结构
方案2:jq命令行工具实现
如果使用命令行环境,jq是更轻量的JSON处理工具,一行命令即可完成筛选:
jq '.Category |= map(select(keys[] | test("Other") | not))' input.json
关键说明:
.Category |= ...直接修改Category数组map(select(...))遍历数组并筛选元素keys[] | test("Other") | not检查元素的所有键是否都不包含"Other"
内容的提问来源于stack exchange,提问作者Tamás Varga
相关产品推荐
相关产品推荐

