如何使用jq合并两个JSON文件的对象并生成指定结构?
问题描述
我有两个JSON文件:
1.json
{ "outputs": { "item1": { "name": "name1", "email": "email1" } } }
2.json
{ "outputs": { "item2": { "name": "name2", "email": "email2" } } }
我尝试用以下jq命令合并它们:
jq -s '{ "Items" : { "list" : .[] | .outputs , }, }' 1.json 2.json
但结果生成了两个Items对象,而我想要的是单个Items对象,结构如下:
{ "Items": { "objects": { "item1": { "name": "name1", "email": "email1" }, "item2": { "name": "name2", "email": "email2" } } } }
我试过用.[0] * .[1]的方式合并,但不知道怎么把它整合到对象构造里,请问该怎么用jq实现?
解决方案
你需要先将两个文件的outputs对象合并,再套入目标结构里。这里有两种可行的方式:
方法一:通用合并(支持任意数量文件)
使用-s选项把所有输入文件转为数组后,提取每个元素的outputs并合并为单一对象,最后构造目标结构:
jq -s '{ Items: { objects: [.[].outputs] | add } }' 1.json 2.json
关键步骤说明:
.[].outputs:从数组的每个元素(对应每个输入JSON文件)中提取outputs对象,得到一个包含多个对象的数组(示例中为[{"item1": ...}, {"item2": ...}])[.[].outputs] | add:将这个对象数组合并成一个单一对象,自动把所有item整合到同一个层级下- 外层的对象构造语法
{ Items: { objects: ... } }直接生成你需要的嵌套结构
方法二:固定双文件合并
如果确定只有两个输入文件,可以直接取数组的前两个元素,用*运算符合并它们的outputs:
jq -s '{ Items: { objects: .[0].outputs * .[1].outputs } }' 1.json 2.json
这种方式更简洁,但只适用于恰好两个文件的场景;如果后续需要合并更多文件,方法一的通用性更强。
运行任意一个命令,都能得到你期望的JSON结构。
内容的提问来源于stack exchange,提问作者Bytamine
相关产品推荐
相关产品推荐

