如何用jq提取heroes.json中嵌套数组的指定字段?
使用jq提取英雄字段并精简超能力数组
没问题,这需求用jq完全可以优雅实现,根本不用手动写迭代器~先假设你的heroes.json结构大概是这样(方便对应理解):
[ { "hero": "Superman", "superpowers": [ {"name": "Flight", "des": "Can fly at supersonic speeds", "other_field": "irrelevant"}, {"name": "Super Strength", "des": "Lifts heavy objects", "extra": "something"} ], "other_info": "whatever" }, { "hero": "Batman", "superpowers": [ {"name": "Intelligence", "des": "Genius-level intellect", "foo": "bar"} ] } ]
直接给你能用的jq命令:
jq 'map({hero, superpowers: .superpowers | map({name, des})})' heroes.json
拆解开看看逻辑:
- 外层
map(...):遍历数组里的每一个英雄对象,逐个处理 {hero}:这是jq的简洁写法,等价于{hero: .hero},直接提取当前对象的hero字段superpowers: .superpowers | map({name, des}):- 先获取当前英雄的
superpowers嵌套数组 - 再用
map({name, des})遍历这个数组,每个超能力对象只保留name和des字段,自动丢掉其他无关字段
- 先获取当前英雄的
- 最后把处理后的所有英雄对象重新组合成数组输出
如果想要直接修改原文件(注意:会覆盖原文件,建议先备份),可以用这个命令:
jq '. = map({hero, superpowers: .superpowers | map({name, des})})' heroes.json > temp.json && mv temp.json heroes.json
额外小提示:
如果有些英雄可能没有superpowers字段(比如普通人?),可以加个容错处理避免报错:
jq 'map({hero, superpowers: (.superpowers // []) | map({name, des})})' heroes.json
这里的// []意思是:如果.superpowers不存在或者是null,就用空数组替代,这样就不会因为缺失字段而抛出错误啦。
内容的提问来源于stack exchange,提问作者ManInTheArena
相关产品推荐
相关产品推荐

