JQ处理JSON:删除数组多余字段并保留entries节点问题咨询
JQ命令JSON过滤问题解决方案
核心问题说明
你当前的命令错误点在于直接提取.entries后拆分了sys和fields为独立输出对象,直接丢失了外层根结构以及每个entry内sys和fields的关联关系。
推荐最优实现(白名单模式,不易出错)
因为你需要保留的字段非常明确,直接构造目标结构比逐个删除多余字段更高效,不会出现漏删或者误删的问题:
jq '.entries |= map({ sys: { id: .sys.id, contentType: { sys: { id: .sys.contentType.sys.id } } }, fields: .fields })' "$infile" > "$outfile"
输出的结构会完全保留外层entries节点,每个数组元素仅包含你需要的三个部分内容。
两个问题解答
1. 如何删除更深层级的对象?
直接在del参数中填写完整的路径即可,数组元素用[]遍历所有项:
- 例如要删除所有entry中
sys.space.sys.linkType字段,写法为:del(.entries[].sys.space.sys.linkType) - 如果要删除整个
space节点,写法为:del(.entries[].sys.space)
你原来的黑名单删除逻辑可以修改为以下写法,即可保留外层结构:
jq 'del( .entries[].metadata, .entries[].sys.createdAt, .entries[].sys.createdBy, .entries[].sys.environment, .entries[].sys.firstPublishedAt, .entries[].sys.publishedAt, .entries[].sys.publishedBy, .entries[].sys.publishedCounter, .entries[].sys.publishedVersion, .entries[].sys.space, .entries[].sys.type, .entries[].sys.updatedAt, .entries[].sys.updatedBy, .entries[].sys.version )' "$infile" > "$outfile"
2. 如何在输出中保留.entries节点?
不要使用.entries | .[]这类直接剥离外层结构的过滤器,使用更新运算符|=对entries数组做原地修改:
|=运算符会对左侧的节点做处理后,替换原节点内容,外层的其他结构完全保留map()用来遍历数组的每一个元素,批量处理所有entry
内容的提问来源于stack exchange,提问作者Katja Eichelberger
相关产品推荐
相关产品推荐

