使用JQ命令按条件添加JSON对象时出错,寻求解决方案
修正JQ命令实现条件添加JSON字段需求
原始JSON输入
[ { "sn": "rv", "amc": { "ott": [ { "req": [ { "wc": "tc", "os": "des", "dt": "rt", "ip": "f" }, { "wc": "nm", "os": "id", "dt": "s", "ip": "t" }, { "wc": "rm", "os": "mo", "dt": "ts", "ip": "f" } ] } ] } }, { "res": [ { "sp": { "dm": "dmValue", "hH": "hHValue" }, "des": "desval", "id": "1234", "mo": "movalur" } ] } ]
原始可工作的JQ命令
[.[1].res as $resources | (.[0].amc.ott[].req[] | {(.wc): {"type": .wc, "value": $resources[0].[(.os)]}})] + [.[1].res as $resources | {"Column" : {"type":"S","value":.[0].sn}}, {"Mod": {"type": (.[0].amc.ott[].req[] | select(.wc == "rm") | .wc), "value": ((.[0].amc.ott[].req[] | select(.wc == "rm") | $resources[0].[(.os)]))}}] | reduce .[] as $item ({}; .*$item)
期望输出
{ "tc": { "type": "tc", "value": "desval" }, "nm": { "type": "nm", "value": "1234", "key3": "hHValue" }, "rm": { "type": "rm", "value": "movalur" }, "Column": { "type": "S", "value": "rv" }, "Mod": { "type": "rm", "value": "movalur" } }
错误尝试的命令及报错信息
错误的JQ命令
[.[1].res as $resources | (.[0].amc.ott[].req[] | {(.wc): {"type": .wc,"value":$resources[0].[(.os)],(if (.ip=="t") then {"key3":$resources[0].sp.hH} end)}})] + [.[1].res as $resources | {"Column" : {"type":"S","value":.[0].sn}},{"Mod":{"type":.[0].amc.ott[].req[] | select(.wc == "rm") | .wc,"value":((.[0].amc.ott[].req[] | select(.wc == "rm") | $resources[0].[(.os)]))}}] | reduce .[] as $item ({}; .*$item)
报错信息
jq: error: syntax error, unexpected '}', expecting ':' (Unix shell quoting issues?) at <top-level>, line 2: {(.wc): {"type": .wc,"value":$resources[0].[(.os)],(if (.ip=="t") then {"key3":$resources[0].sp.hH} end)}})] + jq: error: May need parentheses around object key expression at <top-level>, line 2: {(.wc): {"type": .wc,"value":$resources[0].[(.os)],(if (.ip=="t") then {"key3":$resources[0].sp.hH} end)}})] + jq: error: syntax error, unexpected '{' (Unix shell quoting issues?) at <top-level>, line 3: [.[1].res as $resources | {"Column" : {"type":"S","value":.[0].sn}},{"Mod":{"type":.[0].amc.ott[].req[] | select(.wc == "rm") | .wc,"value":((.[0].amc.ott[].req[] | select(.wc == "rm") | $resources[0].[(.os)]))}}] | reduce .[] as $item ({}; .*$item) jq: error: May need parentheses around object key expression at <top-level>, line 3: [.[1].res as $resources | {"Column" : {"type":"S","value":.[0].sn}},{"Mod":{"type":.[0].amc.ott[].req[] | select(.wc == "rm") | .wc,"value":((.[0].amc.ott[].req[] | select(.wc == "rm") | $resources[0].[(.os)]))}}] | reduce .[] as $item ({}; .*$item) jq: error: syntax error, unexpected ']' (Unix shell quoting issues?) at <top-level>, line 3: [.[1].res as $resources | {"Column" : {"type":"S","value":.[0].sn}},{"Mod":{"type":.[0].amc.ott[].req[] | select(.wc == "rm") | .wc,"value":((.[0].amc.ott[].req[] | select(.wc == "rm") | $resources[0].[(.os)]))}}] | reduce .[] as $item ({}; .*$item) jq: 5 compile errors exit status 3
修正后的JQ命令
[.[1].res as $resources | (.[0].amc.ott[].req[] | {(.wc): ({"type": .wc, "value": $resources[0].[(.os)]} + if .ip == "t" then {"key3": $resources[0].sp.hH} else {} end)})] + [.[1].res as $resources | {"Column" : {"type":"S","value":.[0].sn}}, {"Mod": {"type": (.[0].amc.ott[].req[] | select(.wc == "rm") | .wc), "value": ((.[0].amc.ott[].req[] | select(.wc == "rm") | $resources[0].[(.os)]))}}] | reduce .[] as $item ({}; .*$item)
错误原因及修正说明
报错核心是在对象内部直接插入条件返回的对象作为属性元素,JQ不支持这种语法。正确做法是先定义基础对象{"type": .wc, "value": $resources[0].[(.os)]},再用+运算符合并条件对象:当.ip == "t"时合并{"key3": $resources[0].sp.hH},否则合并空对象{},以此实现条件添加字段的效果。
内容的提问来源于stack exchange,提问作者Pkulkarni
相关产品推荐
相关产品推荐

