jq技术问询:如何将分散对象值合并为单个键值对对象
使用jq将换行分隔的JSON转换为键值对对象
问题描述
你有一组换行分隔的JSON(NDJSON)输入:
{ "metadata": { "guid": "07f90eed-105d-41b2-bc20-4c20dfb51653" }, "entity": { "name": "first" } } { "metadata": { "guid": "da187e3a-8db9-49fd-8c05-41f29cf87f51" }, "entity": { "name": "second" } } { "metadata": { "guid": "6685c3af-5427-4add-8764-7b18ae3c23bb" }, "entity": { "name": "third" } }
想要转换成以entity.name为键、metadata.guid为值的单一JSON对象:
{ "first": "07f90eed-105d-41b2-bc20-4c20dfb51653", "second": "da187e3a-8db9-49fd-8c05-41f29cf87f51", "third": "6685c3af-5427-4add-8764-7b18ae3c23bb" }
解决方案
使用这条jq命令就能实现需求:
jq -n 'reduce inputs as $item ({}; .[$item.entity.name] = $item.metadata.guid)' input.json
命令解释
让我拆解一下每个部分的作用:
-n:关闭jq默认的逐行处理模式,允许我们通过inputs一次性获取所有输入的JSON对象reduce inputs as $item ({}; ...):这是jq的归约操作,从空对象{}开始,遍历每一个输入的JSON对象(存为$item),逐步构建最终的结果对象.[$item.entity.name] = $item.metadata.guid:核心逻辑,把当前对象的entity.name作为键,metadata.guid作为对应的值,添加到结果对象中
运行这条命令后,就能得到你期望的键值对格式JSON啦。
内容的提问来源于stack exchange,提问作者Steve Amerige
相关产品推荐
相关产品推荐

