如何用jq省略子值,仅提取JSON对象的一级键名?
用jq提取JSON对象的顶级键名(不含子值)
嘿,我来帮你搞定这个jq的问题!你现在需要提取.x下面的所有顶级键名(也就是a、b、c、d),而不是它们对应的子对象,对吧?
先回顾下你的原始JSON数据:
~/ cat /tmp/stuff2 | jq '.'
{ "x": { "a": { "c1": 2, "c2": "sss" }, "b": { "c1": 3, "c2": "sfs", "c3": { "d1": "aa", "d2": 3 } }, "c": { "c1": 5, "c2": "ssy" }, "d": { "c1": 8, "c2": "esy" } } }
这里要补充一点:JSON语法里并没有{ "a", "b", "c", "d" }这种格式,正确的键名集合形式是数组["a", "b", "c", "d"],jq可以直接帮你生成这个结果。
解决方案1:按字典序输出键名
用keys命令就能直接获取对象的所有顶级键,它会自动按字典序排序:
cat /tmp/stuff2 | jq '.x | keys'
执行后输出:
["a","b","c","d"]
解决方案2:保留原始键的顺序
如果你需要保持键在原始JSON中的顺序(而不是排序后的),可以用keys_unsorted命令(这个是jq 1.6及以上版本才支持的特性):
cat /tmp/stuff2 | jq '.x | keys_unsorted'
输出结果会和原始JSON里.x下键的顺序一致,同样是数组形式。
简单来说,keys和keys_unsorted就是专门用来提取对象键名的jq内置函数,完全符合你想要“省略键名下子值”的需求~
内容的提问来源于stack exchange,提问作者sevillo
相关产品推荐
相关产品推荐

