如何使用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
相关产品推荐
相关产品推荐

