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

NiFi中嵌套数组的Jolt转换需求及问题咨询

Jolt转换解决方案:为每个Detail记录添加全局行字段

首先,假设你的输入JSON结构如下(可根据实际字段/层级调整):

{
  "header": {
    "batchId": "B001"
  },
  "detail": [
    {
      "detailId": "D001",
      "amount": 100
    },
    {
      "detailId": "D002",
      "amount": 200
    }
  ],
  "lineDetails": [
    {
      "TRADETYP": "BUY",
      "TRANSPORT_CODE": "AIR"
    },
    {
      "TRADETYP": "SELL",
      "TRANSPORT_CODE": "SEA"
    }
  ]
}

以下是满足需求的Jolt Spec,可直接在NiFi的JoltTransformJSON处理器中使用:

[
  // 第一步:提取所有lineDetails的字段值,生成全局数组并合并
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "TRADETYPALLLINES": ["@(1,lineDetails[*].TRADETYP)"],
      "TRANSPORT_CODE_ALLLINES": ["@(1,lineDetails[*].TRANSPORT_CODE)"],
      "TRADETYP_CODE_ALL": ["=join('-', @(1,TRADETYPALLLINES[&]), @(1,TRANSPORT_CODE_ALLLINES[&]))"]
    }
  },
  // 第二步:展开detail数组,将全局字段注入每个detail对象
  {
    "operation": "shift",
    "spec": {
      "detail": {
        "*": {
          "@(2,header)": "header",
          "@": "detail",
          "@(2,TRADETYPALLLINES)": "TRADETYPALLLINES",
          "@(2,TRANSPORT_CODE_ALLLINES)": "TRANSPORT_CODE_ALLLINES",
          "@(2,TRADETYP_CODE_ALL)": "TRADETYP_CODE_ALL",
          "#": "&"
        }
      }
    }
  },
  // 第三步:整理输出结构,生成独立的Detail记录
  {
    "operation": "shift",
    "spec": {
      "*": "[]"
    }
  }
]

转换逻辑说明:

  1. modify-overwrite-beta阶段:

    • 从lineDetails数组中批量提取TRADETYP和TRANSPORT_CODE值,生成两个全局数组
    • 通过join函数将两个数组的对应元素拼接为"值-值"格式,生成TRADETYP_CODE_ALL数组
  2. shift阶段1:

    • 遍历detail数组的每一项,将header、当前detail对象,以及根节点的三个全局字段全部注入到子对象中
    • 用#和&标记每个子对象,为后续展开做准备
  3. shift阶段2:

    • 将嵌套的结构展开,最终输出多个独立的JSON对象,每个对象都包含完整的header、detail数据和三个全局字段

最终输出示例:

[
  {
    "header": {
      "batchId": "B001"
    },
    "detail": {
      "detailId": "D001",
      "amount": 100
    },
    "TRADETYPALLLINES": ["BUY", "SELL"],
    "TRANSPORT_CODE_ALLLINES": ["AIR", "SEA"],
    "TRADETYP_CODE_ALL": ["BUY-AIR", "SELL-SEA"]
  },
  {
    "header": {
      "batchId": "B001"
    },
    "detail": {
      "detailId": "D002",
      "amount": 200
    },
    "TRADETYPALLLINES": ["BUY", "SELL"],
    "TRANSPORT_CODE_ALLLINES": ["AIR", "SEA"],
    "TRADETYP_CODE_ALL": ["BUY-AIR", "SELL-SEA"]
  }
]

如果你的输入结构与示例有差异(比如字段名、层级不同),只需调整Spec中对应的路径即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:27:29