如何使用JQ实现多层级JSON对象过滤?
用JQ实现两种JSON格式转换
格式1:保留一级name字段及过滤后的definedRanges数组
假设你需要过滤definedRanges中符合特定条件的元素(比如排除type为"C"的项),可以用以下命令:
jq '{name, definedRanges: [.definedRanges[] | select(.type != "C")]}' input.json
{name}直接提取顶层的name字段definedRanges: [...]重新构造数组:通过.definedRanges[]遍历原数组元素,select(.type != "C")过滤掉不符合条件的项,最后把结果重新打包成数组
如果过滤条件不同(比如只保留start小于10的元素),修改select()内的判断逻辑即可,例如select(.start < 10)。
格式2:将每个definedRanges元素与对应一级name展开为单条对象
要把definedRanges的每个元素单独拆成一个对象,同时带上顶层的name字段,用这条命令:
jq 'as $parent | .definedRanges[] | {name: $parent.name, start, end, type}' input.json
as $parent先把整个顶层对象存入变量$parent,方便后续引用它的name.definedRanges[]遍历数组中的每一个元素{name: $parent.name, start, end, type}构造新对象,将顶层name与当前遍历到的definedRanges元素字段合并
如果definedRanges内还有其他需要保留的字段,直接在对象结构里添加即可,比如加上description: .description。
内容的提问来源于stack exchange,提问作者EBAH
相关产品推荐
相关产品推荐

