如何使用jq添加并合并JSON对象生成目标结构的JSON?
使用jq添加combined对象的正确方法
方案一:直接在jq中完成合并(无需提前提取节点)
无需单独提取hello和world节点,直接通过jq内部操作合并两个节点内容,生成combined字段:
full="$(jq '.combined = .hello + .world' <<< "$json_string")"
执行后输出的JSON结构与预期完全一致:
{ "hello": { "foo": { "version": "1.1.1" } }, "world": { "bar": { "version": "2.2.2" } }, "combined": { "foo": { "version": "1.1.1" }, "bar": { "version": "2.2.2" } } }
方案二:基于已提取的变量进行合并
如果已经提前提取了hello和world的JSON内容,需注意正确将shell变量传递给jq(避免直接拼接导致语法错误):
- 修正提取变量的命令(移除
-r参数,保留JSON格式输出):
hello="$(jq ".hello" <<< "$json_string")" world="$(jq ".world" <<< "$json_string")"
- 使用
--argjson参数将JSON变量传入jq,完成合并:
full="$(jq --argjson h "$hello" --argjson w "$world" '.combined = $h + $w' <<< "$json_string")"
错误原因说明
你之前的命令错误在于直接将shell变量的内容拼接到jq表达式中,导致jq解析时遇到非语法兼容的字符(比如{)。jq需要通过专门的参数(如--argjson)接收JSON格式的外部数据,而非直接拼接字符串。
内容的提问来源于stack exchange,提问作者stackbiz
相关产品推荐
相关产品推荐

