如何使用jq关联JSON中两个主key的相关数据
解决方法
要实现data数组和included模块的字段关联,关键是先把included数组转换成以cv-id为键的映射表,这样遍历data时能快速通过cv-id匹配到对应的branch和sender-username。
具体jq命令
假设你的JSON响应结构是data存运行记录、included存关联CV信息,用以下命令即可实现需求(需jq 1.5及以上版本支持):
INDEX(.included[]; ."cv-id") as $cvMap | .data[] | { id: .id, message: .message, "created-by": ."created-by", branch: $cvMap[."cv-id"]?.branch // "未找到", "sender-username": $cvMap[."cv-id"]?."sender-username" // "未找到" }
命令说明
INDEX(.included[]; ."cv-id") as $cvMap:用jq的INDEX函数把included数组转成键为cv-id、值为对应CV对象的映射表,后续通过$cvMap["目标cv-id"]就能直接拿到关联数据。.data[]:遍历data里的每一条运行记录。{ ... }:构造新对象,提取当前run的id、message、created-by,再从映射表中匹配对应的分支和用户名。?.和// "未找到":处理cv-id在included中不存在的情况,避免命令报错,同时返回默认提示。
完整使用示例
把curl请求和jq命令结合的写法如下:
curl "你的API接口地址" | jq 'INDEX(.included[]; ."cv-id") as $cvMap | .data[] | {id: .id, message: .message, "created-by": ."created-by", branch: $cvMap[."cv-id"]?.branch // "未找到", "sender-username": $cvMap[."cv-id"]?."sender-username" // "未找到"}'
内容的提问来源于stack exchange,提问作者user2156115
相关产品推荐
相关产品推荐

