如何在jq中获取嵌套对象父键并生成指定schema.table列表?
解决jq获取嵌套对象父键并生成目标列表的问题
我来帮你搞定这个jq的问题~你需要从嵌套JSON里提取status==1的schema.table字符串列表,核心问题就是怎么在jq里拿到父对象的键名,下面一步步来拆解:
问题分析
你之前的jq语句.[]|.[]|(select(.status==1))|"table.schema \(.status)"里,.[]会直接遍历对象的值,丢掉了键名(也就是schema和table的名称),所以没法拼接成目标格式。要拿到父键,得用to_entries把对象转成键值对结构,这样就能同时获取键和值了。
正确的jq命令
基础版(输出每行一个字符串)
to_entries[] | .key as $schema | .value | to_entries[] | select(.value.status == 1) | "\($schema).\(.key)"
数组版(输出符合预期的数组格式)
如果要直接得到数组结果,把整个命令用[]包裹:
[ to_entries[] | .key as $schema | .value | to_entries[] | select(.value.status == 1) | "\($schema).\(.key)" ]
命令拆解
我们一步步解释每个部分的作用:
to_entries[]:把最外层的schema对象(比如{"schema1": {...}, "schema2": {...}})转成键值对数组,每个元素是{key: "schema1", value: {"table1": {...}, "table2": {...}}}.key as $schema:把当前schema的名称(比如schema1)存入变量$schema,方便后续拼接使用.value:取出当前schema对应的所有table对象to_entries[]:再把table对象转成键值对数组,每个元素是{key: "table2", value: {"status": 1}}select(.value.status == 1):筛选出status等于1的table条目"\($schema).\(.key)":把schema名和table名拼接成schema.table的格式
验证结果
用你提供的JSON输入运行上面的数组版命令,会直接得到预期结果:
["schema1.table2", "schema2.table2"]
关于jq获取父键的总结
在jq里处理嵌套对象需要父键时,不要直接用.[]遍历值,而是用to_entries将对象转换为包含key(父键名)和value(对应值)的结构,然后通过变量保存父键,就能在处理子对象时随时引用啦~
内容的提问来源于stack exchange,提问作者Александр Королёв
相关产品推荐
相关产品推荐

