如何使用jq移除对象数组中的非保留字段并清理JSON数据
用jq清理JSON中的非必要字段
原始JSON
{ "meta": { "data1": { "keep": { "key": "value" } } }, "detail": { "data2": [ { "keep1": "keep1value", "keep2": "keep2value", "nokeep1": "abc" } ], "data3": [ { "keep1": "keep1value", "keep2": "keep2value", "nokeep2": { "abc": "def" } } ] }, "drop" : "this" }
清理需求
移除顶层drop字段,同时清理detail下所有数组内对象的非保留字段(如nokeep1、nokeep2等),仅保留每个数组对象中的keep1和keep2字段,期望输出如下:
{ "meta": { "data1": { "keep": { "key": "value" } } }, "detail": { "data2": [ { "keep1": "keep1value", "keep2": "keep2value" } ], "data3": [ { "keep1": "keep1value", "keep2": "keep2value" } ] } }
现有问题
当前使用的jq语句仅能移除顶层drop字段,无法处理数组内的非保留字段:
jq 'def pick($paths): . as $root | reduce ($paths[]|[.]|flatten(1)) as $path ({}; . + setpath($path; $root|getpath($path))); pick([["meta"], ["detail", "data2"], ["detail", "data3"]])'
解决方案
方式一:针对明确的数组字段处理
如果detail下的数组字段固定为data2和data3,可以直接指定字段进行清理:
jq 'del(.drop) | .detail.data2[] |= {keep1, keep2} | .detail.data3[] |= {keep1, keep2}'
del(.drop):移除顶层的drop字段.detail.data2[] |= {keep1, keep2}:遍历data2数组的每个元素,仅保留keep1和keep2字段
方式二:通用化处理(适配任意数组字段)
如果detail下可能存在更多未知名称的数组字段,使用更通用的写法遍历所有子字段:
jq 'del(.drop) | .detail[] |= map({keep1, keep2})'
.detail[]:遍历detail下的所有子字段(此处均为数组)map({keep1, keep2}):对数组中的每个对象,仅保留指定的keep1和keep2字段
内容的提问来源于stack exchange,提问作者lilleng
相关产品推荐
相关产品推荐

