You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:17:01