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

如何用jq或命令行工具为JSON数组对象添加唯一迭代器键

使用jq将JSON数组转换为序号键值结构

要把JSON数组中的每个对象转换为以从1开始的递增序号字符串为键、原对象为值的结构,用jq可以轻松实现,以下是两种高效方案,尤其适合大型JSON文件:

方案1:内存友好的reduce遍历(推荐处理超大文件)

这种方法逐个处理数组元素,无需一次性加载整个数组到内存,适合GB级的大型JSON:

jq 'reduce .[] as $item ({}; . + {(tostring(length + 1)): $item})' input.json

命令解释:

  • reduce .[] as $item:遍历输入数组的每个元素,将当前元素赋值给$item
  • ({}; ...):初始值为空对象,后续逐步构建结果
  • . + {(tostring(length + 1)): $item}:每次将当前结果对象与新的键值对合并,键是当前结果的长度+1(确保序号从1开始)并转为字符串,值为当前数组元素

方案2:基于条目转换的简洁写法

如果文件内存占用在可接受范围内,这种写法更直观:

jq 'to_entries | map({key: (tostring(.key + 1)), value: .value}) | from_entries' input.json

命令解释:

  • to_entries:将数组转换为包含key(原数组索引,从0开始)和value(原数组元素)的条目数组
  • map(...):遍历条目数组,把索引+1后转为字符串作为新的key,保留原元素为value
  • from_entries:将处理后的条目数组转换回对象结构

示例验证

输入(完整JSON数组):

[
    {
        "client": "i-0816dfac36b036002",
        "instance_id": "i-0816dfac36b036002",
        "fstype": "ext4",
        "device": "nvme0n1p1"
    },
    {
        "client": "i-09ae6f92cda7fca83",
        "instance_id": "i-09ae6f92cda7fca83",
        "fstype": "ext4",
        "device": "nvme0n1p1"
    }
]

输出(标准JSON格式):

{
  "1": {
    "client": "i-0816dfac36b036002",
    "instance_id": "i-0816dfac36b036002",
    "fstype": "ext4",
    "device": "nvme0n1p1"
  },
  "2": {
    "client": "i-09ae6f92cda7fca83",
    "instance_id": "i-09ae6f92cda7fca83",
    "fstype": "ext4",
    "device": "nvme0n1p1"
  }
}

注:如果需要输出不带外层大括号的格式(如你给出的示例),可以在命令末尾追加 | to_entries | .[] | "\"\(.key)\": \(.value)",但这种格式不符合标准JSON规范,仅建议在特定场景使用。

内容的提问来源于stack exchange,提问作者goldilocks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:36:26