如何使用JQ筛选JSON数组中的对象并保留指定字段?
解决JQ筛选数组JSON对象保留指定字段的问题
你需要遍历data数组中的每个对象,为每个对象仅保留a和b字段,以下是几种可行的方法:
方法1:简洁字段提取
使用JQ的简写语法直接提取指定字段:
.data[] | {a, b}
解释:
.data[]:遍历data数组中的每一个对象{a, b}:等价于{a: .a, b: .b},从当前遍历到的对象中提取a和b字段,生成新的对象
执行后输出完全符合你的期望:
{"a": "a1", "b": "b1"} {"a": "a2", "b": "b2"}
方法2:使用pick方法(适合多字段场景)
如果需要保留的字段较多,用pick更易维护:
.data[] | pick(["a", "b"])
只需将需要保留的字段名放入数组中即可,效果和方法1一致。
为什么你的之前的命令出错?
你使用的{a: .data[].a, b: .data[].b}会导致笛卡尔积:
.data[].a会遍历数组所有元素的a字段,得到"a1"、"a2".data[].b会遍历数组所有元素的b字段,得到"b1"、"b2"- JQ会将这两组值的所有组合生成对象,因此得到4个结果,这显然不是你想要的对应关系。
可选:输出为数组格式
如果你希望输出是一个包含处理后对象的数组,而不是每个对象单独输出,可以用数组包裹结果:
[.data[] | {a, b}]
输出结果:
[ {"a": "a1", "b": "b1"}, {"a": "a2", "b": "b2"} ]
内容的提问来源于stack exchange,提问作者Wayne Mao
相关产品推荐
相关产品推荐

