如何用jq将types.json作为'typelist'元素合并到config.json根层级?
问题:将types.json内容作为新元素添加到config.json根层级
我是jq新手,需要实现:把types.json的内容作为名为typelist的新元素,添加到config.json的根层级,生成out.json。
我尝试执行的命令:
jq --jsonargs types types.json '. * .["typelist"].$types' config.json > out.json
执行后出现错误:
jq: error: types/0 is not defined at , line 1:
相关文件内容
config.json
{ "origconfig1": { "id1Config1": null, "id2Config1": true, "id3Config1": false, "id24Config1": false }, "origconfig2": { "id1Config2": "", "id2Config2": "3a4b68", "id3Config2": "f2af35", "id4Config2": true, "id5Config2": "d.m.Y", "id6Config2": true } }
types.json
[ { "code": "CODE_TYPE1", "languageCode": "EN", "type": "TYPE1" }, { "code": "CODE_TYPE2", "languageCode": "EN", "type": "TYPE2" }, { "code": "CODE_TYPE3", "languageCode": "EN", "type": "TYPE3" } ]
预期输出out.json
{ "origconfig1": { "id1Config1": null, "id24Config1": false, "id2Config1": true, "id3Config1": false }, "origconfig2": { "id1Config2": "", "id2Config2": "3a4b68", "id3Config2": "f2af35", "id4Config2": true, "id5Config2": "d.m.Y", "id6Config2": true }, "typelist": [ { "code": "CODE_TYPE1", "languageCode": "EN", "type": "TYPE1" }, { "code": "CODE_TYPE2", "languageCode": "EN", "type": "TYPE2" }, { "code": "CODE_TYPE3", "languageCode": "EN", "type": "TYPE3" } ] }
正确实现方法
之前的命令错误在于--jsonargs用法不当,且jq表达式逻辑混乱。以下两种方法可以实现需求:
方法1:使用--argfile(jq 1.5+适用)
jq --argfile types types.json '. + {typelist: $types}' config.json > out.json
--argfile会把types.json的JSON内容读取到变量$types中. + {typelist: $types}将config.json的对象和包含typelist键的新对象合并,完成新元素添加
方法2:使用输入重定向(通用方法)
jq -n 'input + {typelist: input}' config.json types.json > out.json
-n参数让jq不自动读取输入,而是通过input命令手动读取文件- 第一个
input读取config.json内容,第二个input读取types.json内容,合并后输出包含typelist的新对象
错误原因说明
你用的--jsonargs是传递JSON参数的工具,但用法不正确;同时表达式. * .["typelist"].$types既错误引用变量,又误用乘法合并对象,导致jq解析报错。
内容的提问来源于stack exchange,提问作者JackNagger
相关产品推荐
相关产品推荐

