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

JOLT JSON转换:按动态属性值过滤数组失效问题排查

JOLT动态值过滤数组失效问题解决

问题说明

在JOLT JSON转换场景中,使用静态值过滤数组时功能正常,但通过动态值(如输入中的selected_key字段)进行过滤时,过滤逻辑失效,所有数组项均被保留到输出中。

输入JSON

{
  "selected_key": "key2",
  "keys": [
    {
      "name": "value1",
      "key": "key1"
    },
    {
      "name": "value21",
      "key": "key2"
    },
    {
      "name": "value22",
      "key": "key2"
    },
    {
      "name": "value3",
      "key": "key3"
    },
    {
      "name": "value4",
      "key": "key4"
    }
  ]
}

原JOLT规格(失效版本)

[
  {
    "operation": "shift",
    "spec": {
      "keys": {
        "*": {
          "key": {
            "@(4,selected_key)": {
              "@2": "test"
            }
          }
        }
      }
    }
  }
]

预期输出

{
  "test": [
    {
      "name": "value21",
      "key": "key2"
    },
    {
      "name": "value22",
      "key": "key2"
    }
  ]
}

实际输出(过滤失效)

{
  "test": [
    {
      "name": "value1",
      "key": "key1"
    },
    {
      "name": "value21",
      "key": "key2"
    },
    {
      "name": "value22",
      "key": "key2"
    },
    {
      "name": "value3",
      "key": "key3"
    },
    {
      "name": "value4",
      "key": "key4"
    }
  ]
}

解决方法

原规格失效的核心原因是路径引用错误:在keys.*.key层级下,根节点的selected_key需要通过@(3,selected_key)引用(从当前key节点往上数3层到达根节点),而非@(4,selected_key)。以下是修正后的JOLT规格:

方案1:简洁版shift操作

[
  {
    "operation": "shift",
    "spec": {
      "keys": {
        "*": {
          "@(2,key)": {
            "@(3,selected_key)": {
              "@2": "test[]"
            }
          }
        }
      }
    }
  }
]

方案2:临时变量辅助(更易理解)

[
  {
    "operation": "shift",
    "spec": {
      "selected_key": "&",
      "keys": {
        "*": {
          "@": "temp[]"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "temp": {
        "*": {
          "key": {
            "@(3,selected_key)": {
              "@2": "test[]"
            }
          }
        }
      }
    }
  },
  {
    "operation": "remove",
    "spec": ["selected_key", "temp"]
  }
]

原理说明

  • 方案1中,@(2,key)获取当前数组项的key值,@(3,selected_key)获取根节点的动态匹配值,只有当两者相等时,才将当前数组项(@2)写入test数组。
  • 方案2通过临时数组temp暂存所有keys项,再基于selected_key进行匹配过滤,最后移除临时变量,逻辑更直观。

内容的提问来源于stack exchange,提问作者Jeya Prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:25:52