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

Jolt实现非空判断后新增字段问题(含数组场景)

可行的Jolt转换规则

核心需求回顾

仅当cp1/cp2为非空对象时,将同级的no1字段注入到其内部;若为null则保留原null值,不做修改。


单对象场景(输入为单个data对象)

输入示例

{
  "data": {
    "no1": 12345,
    "cp1": {
      "cp1_sub1": "sub1",
      "cp2_sub2": "sub2"
    },
    "cp2": null
  }
}

Jolt规则

[
  // 第一步:保留原始cp1/cp2(含null值),避免后续操作丢失
  {
    "operation": "shift",
    "spec": {
      "data": {
        "no1": "data.no1",
        "cp1": {
          "@": "data.cp1"
        },
        "cp2": {
          "@": "data.cp2"
        }
      }
    }
  },
  // 第二步:仅向非空的cp1/cp2注入no1字段
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "cp1": {
          "=notNull": ["@(2,no1)", null],
          "no1": "=if(@(1,=notNull), @(2,no1))"
        },
        "cp2": {
          "=notNull": ["@(2,no1)", null],
          "no1": "=if(@(1,=notNull), @(2,no1))"
        }
      }
    }
  },
  // 第三步:清理临时生成的=notNull字段
  {
    "operation": "remove",
    "spec": {
      "data": {
        "cp1": {
          "=notNull": ""
        },
        "cp2": {
          "=notNull": ""
        }
      }
    }
  }
]

输出结果

{
  "data": {
    "no1": 12345,
    "cp1": {
      "cp1_sub1": "sub1",
      "cp2_sub2": "sub2",
      "no1": 12345
    },
    "cp2": null
  }
}

数组场景(输入为data数组)

输入示例

{
  "abc": "def",
  "data": [
    {
      "no1": 12345,
      "cp1": {
        "cp1_sub1": "sub1",
        "cp2_sub2": "sub2"
      },
      "cp2": null
    },
    {
      "no1": 56789,
      "cp1": null,
      "cp2": {
        "cp3_sub1": "sub1",
        "cp3_sub2": "sub2"
      }
    }
  ]
}

Jolt规则

在单对象规则基础上,对数组元素使用*通配符遍历处理:

[
  // 第一步:保留原始字段(含数组元素的null值)
  {
    "operation": "shift",
    "spec": {
      "abc": "abc",
      "data": {
        "*": {
          "no1": "data[&1].no1",
          "cp1": {
            "@": "data[&2].cp1"
          },
          "cp2": {
            "@": "data[&2].cp2"
          }
        }
      }
    }
  },
  // 第二步:向数组中每个元素的非空cp1/cp2注入no1
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "*": {
          "cp1": {
            "=notNull": ["@(2,no1)", null],
            "no1": "=if(@(1,=notNull), @(2,no1))"
          },
          "cp2": {
            "=notNull": ["@(2,no1)", null],
            "no1": "=if(@(1,=notNull), @(2,no1))"
          }
        }
      }
    }
  },
  // 第三步:清理临时字段
  {
    "operation": "remove",
    "spec": {
      "data": {
        "*": {
          "cp1": {
            "=notNull": ""
          },
          "cp2": {
            "=notNull": ""
          }
        }
      }
    }
  }
]

输出结果

{
  "abc": "def",
  "data": [
    {
      "no1": 12345,
      "cp1": {
        "cp1_sub1": "sub1",
        "cp2_sub2": "sub2",
        "no1": 12345
      },
      "cp2": null
    },
    {
      "no1": 56789,
      "cp1": null,
      "cp2": {
        "cp3_sub1": "sub1",
        "cp3_sub2": "sub2",
        "no1": 56789
      }
    }
  ]
}

规则关键逻辑说明

  1. Shift操作:优先保留原始cp1/cp2的所有值(包括null),避免后续修改操作误删null字段。
  2. Modify操作:
    • 用=notNull判断当前cp1/cp2是否为非空对象,生成临时标记;
    • 通过=if条件判断:仅当临时标记有效(即目标是对象)时,注入同级的no1值。
  3. Remove操作:清理临时生成的=notNull字段,保证输出结构整洁。

内容的提问来源于stack exchange,提问作者Ketan Bhavsar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:50:31