求生成多数组笛卡尔积的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": "" } } } ]
步骤说明
- 拆分准备:将公共字段集中,把物料相关的两个数组按索引配对,尺码数组单独拆分;
- 笛卡尔积生成:通过索引组合,生成物料组与尺码的全量组合;
- 结构扁平化:将嵌套的公共字段展开到每个对象中,提取物料和尺码字段;
- 清理节点:移除过程中产生的临时节点,得到最终结构。
内容的提问来源于stack exchange,提问作者jitendra rawat
相关产品推荐
相关产品推荐

