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

如何用Jolt处理JSON对象/数组并提取首个非空systemName值

使用Jolt处理单对象/数组输入,提取首个非空非null值

我拿到的JSON输入里,insertEvent字段有时是单个对象,有时是数组形式。需要从insertEvent.systemDetails.systems.sourceSystemName和insertEvent.xrefKey.systemName这两个字段里,提取第一个非空、非null的值作为systemName输出,该怎么用Jolt实现?


无数组的输入示例

{
  "eventMetadata": {
    "eventType": "Insert",
    "baseObjectUid": "BASE_OBJECT",
    "orsId": "orcl-TCR_HUB",
    "triggerUid": "MESSAGE_QUEUE_RULE",
    "messageId": "300894188",
    "messageDate": "2023-08-30T23:54:32.335Z"
  },
  "insertEvent": {
    "systemDetails":{
      "systems":{
        "sourceSystemName": "R12"
      }
    },
    "sourceKey": "XXXXX",
    "eventDate": "2023-08-30T23:54:32.335Z",
    "rowid": "9800029",
    "xrefKey": {
      "systemName": "",
      "sourceKey": "XXXXX"
    }
  }
}

预期输出

{
  "systemName": "R12"
}

带数组的输入示例

{
  "eventMetadata": {
    "eventType": "Insert",
    "baseObjectUid": "BASE_OBJECT",
    "orsId": "orcl-TCR_HUB",
    "triggerUid": "MESSAGE_QUEUE_RULE",
    "messageId": "300894188",
    "messageDate": "2023-08-30T23:54:32.335Z"
  },
  "insertEvent": [
    {
      "systemDetails":{
      "systems":{
        "sourceSystemName": ""
      }
    },
      "sourceKey": "XXXXX",
      "eventDate": "2023-08-30T23:54:32.335Z",
      "rowid": "9800029",
      "xrefKey": {
        "systemName": "",
        "sourceKey": "XXXXX"
      }
    },
    {
      "systemDetails":{
      "systems":{
        "sourceSystemName": "R12"
      }
    },
      "sourceKey": "XXXXX",
      "eventDate": "2023-08-30T23:54:32.335Z",
      "rowid": "9800029",
      "xrefKey": {
        "systemName": "",
        "sourceKey": "XXXXX"
      }
    },
    {
      "systemDetails":{
      "systems":{
        "sourceSystemName": "Y12"
      }
    },
      "sourceKey": "XXXXX",
      "eventDate": "2023-08-30T23:54:32.335Z",
      "rowid": "9800029",
      "xrefKey": {
        "systemName": "Y12",
        "sourceKey": "XXXXX"
      }
    }
  ]
}

预期输出

{
  "systemName": "R12"
}

Jolt转换规则

核心思路是先统一输入格式(把单个对象转成数组),再收集所有候选值、过滤空值,最后取第一个有效结果。

[
  // 第一步:统一格式,把单个insertEvent对象转为数组,数组则保持原样
  {
    "operation": "shift",
    "spec": {
      "insertEvent": {
        "*": "insertEvent[]",
        "@": "insertEvent[]"
      }
    }
  },
  // 第二步:收集所有候选的systemName值
  {
    "operation": "shift",
    "spec": {
      "insertEvent": {
        "*": {
          "systemDetails": {
            "systems": {
              "sourceSystemName": "candidates[]"
            }
          },
          "xrefKey": {
            "systemName": "candidates[]"
          }
        }
      }
    }
  },
  // 第三步:过滤掉空字符串和null值
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "candidates": "=filterNull",
      "candidates": "=filterEmpty"
    }
  },
  // 第四步:取第一个非空值作为systemName
  {
    "operation": "shift",
    "spec": {
      "candidates": {
        "0": "systemName"
      }
    }
  }
]

规则说明

  1. 统一格式:通过shift操作,不管insertEvent是对象还是数组,都转为数组结构。"*": "insertEvent[]"处理数组元素,"@": "insertEvent[]"处理单个对象。
  2. 收集候选值:遍历所有insertEvent元素,把两个目标字段的值都存入candidates数组。
  3. 过滤空值:用modify-overwrite-beta结合filterNull和filterEmpty,移除数组中的空字符串和null。
  4. 提取首个有效值:取过滤后candidates数组的第一个元素,作为最终的systemName输出。

验证结果

把上述Jolt规则分别应用到两种输入上,都能得到符合预期的输出。


内容的提问来源于stack exchange,提问作者Prasad S Deshpande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:44:53