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

如何使用jq将场地JSON数据重新格式化为指定结构?

解决方法与参考手册内容

一、需重点查看的jq手册章节

  • reduce 函数:这是将数组转换为单个对象的核心工具,手册会讲解它的迭代累积逻辑——通过初始值和迭代操作,把数组元素逐步合并成目标对象。
  • 动态对象键构造:关注对象字面量中(表达式): 值的语法,这允许你用计算出的值(比如数组索引)作为对象的键。
  • to_entries/from_entries 方法:理解数组与键值对对象的转换规则,to_entries能把数组转换成包含key(元素索引)和value(原元素)的对象数组,后续可通过add合并为单个对象。
  • 嵌套字段访问:确认层级字段的访问语法(如.venue.id),确保能正确提取嵌套对象中的指定字段。

二、具体实现示例

假设你的输入JSON结构如下:

[
  {"venue": {"id": 101, "name": "奥体中心", "city": "北京", "state": "北京", "country": "中国"}},
  {"venue": {"id": 102, "name": "天河体育中心", "city": "广州", "state": "广东", "country": "中国"}}
]

方法1:使用reduce迭代构建对象

reduce会遍历数组,将每个元素按索引添加到初始空对象中,最终生成目标结构:

reduce .[] as $item ({}; 
  . + {
    (tostring($index)): {
      id: $item.venue.id,
      name: $item.venue.name,
      city: $item.venue.city  // 替换为你需要的字段
    }
  }
)

方法2:使用to_entries转换后合并

先把数组转成带索引的键值对数组,处理字段后再合并为单个对象:

to_entries | map({
  (tostring(.key)): {
    id: .value.venue.id,
    name: .value.venue.name,
    city: .value.venue.city
  }
}) | add

三、为什么map达不到效果?

map的作用是将数组的每个元素转换为新元素,返回的仍然是数组,而你需要的是单个对象。要完成数组到对象的转换,必须用reduce或者to_entries + add这类能将多个键值对合并为单个对象的操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:50:58