如何使用jq查找包含特定字符串的JSON键?
如何用jq查找包含特定字符串的JSON键?
我来帮你搞定这个问题!用jq处理JSON中包含特定字符串的键其实很灵活,下面结合你给出的示例JSON,分两种常见场景来演示:
首先先把你的示例JSON整理成完整可运行的格式:
{ "orderTotal_1": { "fields": { "button": { "actionDialog": null, "actionUrl": null, "clicked": false, "enable": true, "text": "LANJUTKAN KE PEMBAYARAN", "textColor": null }, "payment": { "pay": "Rp1.953.800", "taxTip": "Termasuk PPN, jika berlaku.", "title": "Total" }, "timestamp": 1522355946093 }, "id": "1", "tag": "orderTotal", "type": "biz" }, "rightContainer_10010": { "fields": { "css": { "backgroundColor": null, "floatPosition": "right", "marginTop": null, "width": "388px" } } } }
场景1:只查找顶层键中包含特定字符串
比如你想找顶层键里包含orderTotal的项,直接用下面的命令就能筛选出键名:
jq 'keys[] | select(. | contains("orderTotal"))' your_file.json
运行后会输出:
"orderTotal_1"
要是你需要连带着键对应的完整值一起输出,调整一下命令就行:
jq 'to_entries[] | select(.key | contains("orderTotal")) | {key: .key, value: .value}' your_file.json
输出结果会是包含键值对的完整JSON结构:
{ "key": "orderTotal_1", "value": { "fields": { "button": { "actionDialog": null, "actionUrl": null, "clicked": false, "enable": true, "text": "LANJUTKAN KE PEMBAYARAN", "textColor": null }, "payment": { "pay": "Rp1.953.800", "taxTip": "Termasuk PPN, jika berlaku.", "title": "Total" }, "timestamp": 1522355946093 }, "id": "1", "tag": "orderTotal", "type": "biz" } }
场景2:递归查找所有层级的键中包含特定字符串
如果要找所有嵌套层级里的键(比如示例里的actionDialog、actionUrl这类),可以用递归遍历的方式。比如找包含action的所有键:
jq '.. | objects | keys[] | select(. | contains("action"))' your_file.json
这个命令的逻辑是:..递归遍历所有节点,objects只保留对象类型的节点,keys[]列出每个对象的键,最后用select筛选出包含目标字符串的键。运行后输出:
"actionDialog" "actionUrl"
要是你还想知道这些键在JSON里的具体路径和对应的值,可以用这个进阶命令:
jq 'path(.. | objects | keys[] | select(. | contains("action")) as $k | .[$k]) as $p | {path: $p, key: $p[-1], value: getpath($p)}' your_file.json
输出会清晰展示每个匹配键的路径、键名和对应值:
{ "path": [ "orderTotal_1", "fields", "button", "actionDialog" ], "key": "actionDialog", "value": null } { "path": [ "orderTotal_1", "fields", "button", "actionUrl" ], "key": "actionUrl", "value": null }
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

