使用jq能否筛选多级JSON指定字段并返回原结构对象?
结论
完全可以实现,jq原生支持嵌套结构构造,可精准保留原JSON的层级结构,仅筛选需要的字段。
示例场景实现
你给出的示例对应的jq命令如下:
jq '{string, object: {a}}' 输入文件路径
执行后输出结果和你预期的完全一致:
{ "object": { "a": "b" }, "string": "Hello World" }
多层级通用写法
不管JSON层级多深,都可以按照「层级嵌套构造对象」的规则编写筛选规则,规则如下:
- 同一层级需要保留的多个字段用英文逗号分隔
- 子层级需要筛选字段的,在父字段后用冒号加嵌套的对象结构,逐层往下写即可
比如4层以上的复杂场景示例,假设你需要保留:
- 顶层字段:
name、id - 顶层对象
info下的字段:createTime、updateTime info下的对象ext下的字段:type、statusext下的对象detail下的字段:content、url
对应的jq规则写法:
jq '{name, id, info: {createTime, updateTime, ext: {type, status, detail: {content, url}}}}' 输入文件路径
特殊场景处理
如果需要筛选数组内对象的指定字段,配合数组遍历语法即可,比如顶层data字段是数组,每个元素需要保留id和title,写法如下:
jq '{data: [.data[] | {id, title}], 其他需要保留的顶层字段}'
如果担心某层级字段不存在导致报错,可以加可选符?和空值 fallback 逻辑:
# 即使object字段不存在也不会报错,会返回空对象 jq '{string, object: (.object? // {} | {a})}' 输入文件路径
内容的提问来源于stack exchange,提问作者calvh
相关产品推荐
相关产品推荐

