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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:30:24