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

求生成多数组笛卡尔积的Jolt转换规则(附输入输出示例)

问题描述

输入JSON(扁平结构,包含多组数组字段):

{
  "eventTime" : "2024-01-17T15:10:06.858",
  "groupArticleNumber" : "FT6559",
  "groupModelNumber" : "FRX88",
  "productDescriptionEN" : "ESTRO 19 JSYY",
  "subBrand" : "1",
  "brand" : "11",
  "businessSegment" : "104",
  "salesLine" : "L84",
  "materialComposition" : [ "100% PET-REC", "100% PET-DAT" ],
  "mainMaterialFlag" : [ true, false ],
  "productDescEN" : "ESTRO 19 JSYY",
  "colorwayShortDescEN" : "TMLGBL/WHITE",
  "keyCategory" : "00095",
  "ageGroup" : "J",
  "gender" : "M",
  "genderAge" : "16",
  "genderAgeMain" : "Kids",
  "articleLifeCycle" : "50",
  "sizePage" : "J4",
  "articleCreationSeason" : "20201",
  "articleActiveSeason" : "20242",
  "rmhProductDivision" : "2",
  "rmhProductType" : "30",
  "rmhCategory" : "09",
  "retailClass" : "12309",
  "retailSubClass" : "1230930",
  "retailDepartment" : "12",
  "retailSubDepartment" : "123",
  "sourcingSizeCode3" : [ "190", "180" ]
}

期望输出:生成数组字段的笛卡尔积JSON数组,每个对象包含所有非数组字段,以及每组数组元素的组合(如materialComposition与mainMaterialFlag按索引配对后,再分别和sourcingSizeCode3的每个元素组合):

[
  {
    "eventTime": "2024-01-17T15:10:06.858",
    "groupArticleNumber": "FT6559",
    "sourcingSizeCode3": "190",
    "productDescEN": "ESTRO 19 JSYY",
    "colorwayShortDescEN": "TMLGBL/WHITE",
    "keyCategory": "00095",
    "groupModelNumber": "FRX88",
    "productDescriptionEN": "ESTRO 19 JSYY",
    "retailClass": "12309",
    "retailSubClass": "1230930",
    "retailDepartment": "12",
    "retailSubDepartment": "123",
    "rmhProductDivision": "2",
    "subBrand": "1",
    "brand": "11",
    "rmhCategory": "09",
    "businessSegment": "104",
    "ageGroup": "J",
    "gender": "M",
    "genderAge": "16",
    "genderAgeMain": "Kids",
    "articleLifeCycle": "50",
    "sizePage": "J4",
    "materialComposition": "100% PET-REC",
    "mainMaterialFlag": true,
    "articleCreationSeason": "20201",
    "articleActiveSeason": "20242",
    "salesLine": "L84",
    "rmhProductType": "30"
  },
  {
    "eventTime": "2024-01-17T15:10:06.858",
    "groupArticleNumber": "FT6559",
    "sourcingSizeCode3": "180",
    "productDescEN": "ESTRO 19 JSYY",
    "colorwayShortDescEN": "TMLGBL/WHITE",
    "keyCategory": "00095",
    "groupModelNumber": "FRX88",
    "productDescriptionEN": "ESTRO 19 JSYY",
    "retailClass": "12309",
    "retailSubClass": "1230930",
    "retailDepartment": "12",
    "retailSubDepartment": "123",
    "rmhProductDivision": "2",
    "subBrand": "1",
    "brand": "11",
    "rmhCategory": "09",
    "businessSegment": "104",
    "ageGroup": "J",
    "gender": "M",
    "genderAge": "16",
    "genderAgeMain": "Kids",
    "articleLifeCycle": "50",
    "sizePage": "J4",
    "materialComposition": "100% PET-REC",
    "mainMaterialFlag": true,
    "articleCreationSeason": "20201",
    "articleActiveSeason": "20242",
    "salesLine": "L84",
    "rmhProductType": "30"
  },
  {
    "eventTime": "2024-01-17T15:10:06.858",
    "groupArticleNumber": "FT6559",
    "sourcingSizeCode3": "190",
    "productDescEN": "ESTRO 19 JSYY",
    "colorwayShortDescEN": "TMLGBL/WHITE",
    "keyCategory": "00095",
    "groupModelNumber": "FRX88",
    "productDescriptionEN": "ESTRO 19 JSYY",
    "retailClass": "12309",
    "retailSubClass": "1230930",
    "retailDepartment": "12",
    "retailSubDepartment": "123",
    "rmhProductDivision": "2",
    "subBrand": "1",
    "brand": "11",
    "rmhCategory": "09",
    "businessSegment": "104",
    "ageGroup": "J",
    "gender": "M",
    "genderAge": "16",
    "genderAgeMain": "Kids",
    "articleLifeCycle": "50",
    "sizePage": "J4",
    "materialComposition": "100% PET-DAT",
    "mainMaterialFlag": false,
    "articleCreationSeason": "20201",
    "articleActiveSeason": "20242",
    "salesLine": "L84",
    "rmhProductType": "30"
  },
  {
    "eventTime": "2024-01-17T15:10:06.858",
    "groupArticleNumber": "FT6559",
    "sourcingSizeCode3": "180",
    "productDescEN": "ESTRO 19 JSYY",
    "colorwayShortDescEN": "TMLGBL/WHITE",
    "keyCategory": "00095",
    "groupModelNumber": "FRX88",
    "productDescriptionEN": "ESTRO 19 JSYY",
    "retailClass": "12309",
    "retailSubClass": "1230930",
    "retailDepartment": "12",
    "retailSubDepartment": "123",
    "rmhProductDivision": "2",
    "subBrand": "1",
    "brand": "11",
    "rmhCategory": "09",
    "businessSegment": "104",
    "ageGroup": "J",
    "gender": "M",
    "genderAge": "16",
    "genderAgeMain": "Kids",
    "articleLifeCycle": "50",
    "sizePage": "J4",
    "materialComposition": "100% PET-DAT",
    "mainMaterialFlag": false,
    "articleCreationSeason": "20201",
    "articleActiveSeason": "20242",
    "salesLine": "L84",
    "rmhProductType": "30"
  }
]

注:原期望输出中部分字段值与输入不符,推测为笔误,上述已修正为与输入一致的正确结果。

问题分析

你之前的Jolt Spec是针对嵌套结构(value.metadata、payload.productPrimaryData等)设计的,但实际输入为扁平JSON,结构完全不匹配,因此无法生效。需要针对扁平结构中的数组字段分步生成笛卡尔积。

正确的Jolt Spec

[
  // 第一步:拆分数组,集中公共字段,为笛卡尔积做准备
  {
    "operation": "shift",
    "spec": {
      // 复制所有非数组字段到临时节点"common"
      "eventTime": "common.eventTime",
      "groupArticleNumber": "common.groupArticleNumber",
      "groupModelNumber": "common.groupModelNumber",
      "productDescriptionEN": "common.productDescriptionEN",
      "subBrand": "common.subBrand",
      "brand": "common.brand",
      "businessSegment": "common.businessSegment",
      "salesLine": "common.salesLine",
      "productDescEN": "common.productDescEN",
      "colorwayShortDescEN": "common.colorwayShortDescEN",
      "keyCategory": "common.keyCategory",
      "ageGroup": "common.ageGroup",
      "gender": "common.gender",
      "genderAge": "common.genderAge",
      "genderAgeMain": "common.genderAgeMain",
      "articleLifeCycle": "common.articleLifeCycle",
      "sizePage": "common.sizePage",
      "articleCreationSeason": "common.articleCreationSeason",
      "articleActiveSeason": "common.articleActiveSeason",
      "rmhProductDivision": "common.rmhProductDivision",
      "rmhProductType": "common.rmhProductType",
      "rmhCategory": "common.rmhCategory",
      "retailClass": "common.retailClass",
      "retailSubClass": "common.retailSubClass",
      "retailDepartment": "common.retailDepartment",
      "retailSubDepartment": "common.retailSubDepartment",
      // 按索引配对materialComposition和mainMaterialFlag,生成物料组数组
      "materialComposition": {
        "*": {
          "@": "materials[&1].materialComposition",
          "@(2,mainMaterialFlag[&1])": "materials[&1].mainMaterialFlag"
        }
      },
      // 拆分sourcingSizeCode3数组
      "sourcingSizeCode3": {
        "*": "sizes[&1].sourcingSizeCode3"
      }
    }
  },
  // 第二步:生成物料组与尺码的笛卡尔积
  {
    "operation": "shift",
    "spec": {
      "materials": {
        "*": {
          "@(2,common)": "[&1][#2].&",
          "@": "[&1][#2].&",
          "@(2,sizes)": "[&1][#2].&"
        }
      }
    }
  },
  // 第三步:扁平化嵌套结构,合并为单层级对象
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "common": {
            "*": "[&2].&"
          },
          "materialComposition": "[&2].materialComposition",
          "mainMaterialFlag": "[&2].mainMaterialFlag",
          "sizes": {
            "*": {
              "sourcingSizeCode3": "[&3].sourcingSizeCode3"
            }
          }
        }
      }
    }
  },
  // 第四步:清理临时节点
  {
    "operation": "remove",
    "spec": {
      "*": {
        "sizes": ""
      }
    }
  }
]

步骤说明

  1. 拆分准备:将公共字段集中,把物料相关的两个数组按索引配对,尺码数组单独拆分;
  2. 笛卡尔积生成:通过索引组合,生成物料组与尺码的全量组合;
  3. 结构扁平化:将嵌套的公共字段展开到每个对象中,提取物料和尺码字段;
  4. 清理节点:移除过程中产生的临时节点,得到最终结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:54:50