如何用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,保留原元素为valuefrom_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
相关产品推荐
相关产品推荐

