You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:48:00