适配有无嵌套数组场景的动态Jolt Spec实现方案咨询
适配含/不含sku嵌套数组的Jolt Spec解决方案
问题背景
现有Jolt Spec在处理包含sku嵌套数组的JSON数据时运行正常,但接收的JSON中没有该数组时会执行失败,需要调整Spec使其同时适配两种场景。
输入示例
输入1(含sku嵌套数组)
[ { "payload": { "header": { "sender": "GRPSPM" }, "article": { "groupModelNumber": "LPZ48", "groupArticleNumber": "IF5561", "rmh": [ { "rmhMarketingDivision": "1", "rmhProductDivision": "1", "rmhGender": "2", "rmhCategory": "20", "rmhProductType": "09", "retailDepartment": "11", "retailSubDepartment": "112", "retailClass": "11220", "retailSubClass": "1122009" } ], "sku": [ { "skuChange": false, "sourcingSizeScale": "T1", "sourcingSizeCode2": "28", "sourcingSizeCode3": "610", "eanNumber": "4066765529183", "upcNumber": "196472210778", "feasibilityIndicator": true, "activeIndicator": true }, { "skuChange": false, "sourcingSizeScale": "T1", "sourcingSizeCode2": "31", "sourcingSizeCode3": "640", "eanNumber": "4066765529169", "upcNumber": "196472210761", "feasibilityIndicator": true, "activeIndicator": true } ] } } } ]
输入2(不含sku嵌套数组)
[ { "payload": { "header": { "sender": "GRPSPM" }, "article": { "groupModelNumber": "LPZ48", "groupArticleNumber": "IF5561", "rmh": [ { "rmhMarketingDivision": "1", "rmhProductDivision": "1", "rmhGender": "2", "rmhCategory": "20", "rmhProductType": "09", "retailDepartment": "11", "retailSubDepartment": "112", "retailClass": "11220", "retailSubClass": "1122009" } ] } } } ]
当前使用的Jolt Spec
[ { "operation": "shift", "spec": { "@": "input", "@(0)": "val0" } }, { "operation": "modify-overwrite-beta", "spec": { "val0": "=toString", "chr": ["=substring(@(1,val0),0,1)", "["] } }, { "operation": "shift", "spec": { "chr": { "{": { "@(2,input)": "[]" }, "*": { "@(2,input)": "" } } } }, { "operation": "shift", "spec": { "*": { "payload": { "article": { "groupModelNumber": "groupModelNumber", "groupArticleNumber": "groupArticleNumber", "sku": { "*": { "sourcingSizeCode3": "sourcingSizeCode3", "feasibilityIndicator": "feasibilityIndicator", "activeIndicator": "activeIndicator" } }, "rmh": { "*": { "retailClass": "retailClass", "retailSubClass": "retailSubClass", "retailDepartment": "retailDepartment", "retailSubDepartment": "retailSubDepartment", "rmhProductDivision": "rmhProductDivision", "rmhCategory": "rmhCategory", "rmhProductType": "rmhProductType" } } } } } } }, { "operation": "shift", "spec": { "sourcingSizeCode3": { "*": { "@(2,groupModelNumber)": "[#2].groupModelNumber", "@": "[#2].&2", "@(2,retailClass)": "[#2].retailClass", "@(2,retailSubClass)": "[#2].retailSubClass", "@(2,retailDepartment)": "[#2].retailDepartment", "@(2,retailSubDepartment)": "[#2].retailSubDepartment", "@(2,rmhProductDivision)": "[#2].rmhProductDivision", "@(2,rmhCategory)": "[#2].rmhCategory", "@(2,rmhProductType)": "[#2].rmhProductType" } }, "activeIndicator": { "*": { "@": "[#2].&2" } }, "feasibilityIndicator": { "*": { "@": "[#2].&2" } } } } ]
期望输出
输入1期望输出
[ { "groupModelNumber": "LPZ48", "sourcingSizeCode3": "610", "retailClass": "11220", "retailSubClass": "1122009", "retailDepartment": "11", "retailSubDepartment": "112", "rmhProductDivision": "1", "rmhCategory": "20", "rmhProductType": "09", "activeIndicator": true, "feasibilityIndicator": true }, { "groupModelNumber": "LPZ48", "sourcingSizeCode3": "640", "retailClass": "11220", "retailSubClass": "1122009", "retailDepartment": "11", "retailSubDepartment": "112", "rmhProductDivision": "1", "rmhCategory": "20", "rmhProductType": "09", "activeIndicator": true, "feasibilityIndicator": true } ]
输入2期望输出
{ "groupModelNumber" : "LPZ48", "groupArticleNumber" : "IF5561", "retailClass" : "11220", "retailSubClass" : "1122009", "retailDepartment" : "11", "retailSubDepartment" : "112", "rmhProductDivision" : "1", "rmhCategory" : "20", "rmhProductType" : "09" }
修改后的Jolt Spec
[ { "operation": "shift", "spec": { "@": "input" } }, { "operation": "modify-overwrite-beta", "spec": { "input": { "*": { "payload": { "article": { // 若sku不存在,默认赋值为空数组 "sku": ["@(1,sku)", []] } } } } } }, { "operation": "shift", "spec": { "input": { "*": { "payload": { "article": { "groupModelNumber": "groupModelNumber", "groupArticleNumber": "groupArticleNumber", "sku": { "*": { "sourcingSizeCode3": "sourcingSizeCode3[&1]", "feasibilityIndicator": "feasibilityIndicator[&1]", "activeIndicator": "activeIndicator[&1]" } }, "rmh": { "*": { "retailClass": "retailClass", "retailSubClass": "retailSubClass", "retailDepartment": "retailDepartment", "retailSubDepartment": "retailSubDepartment", "rmhProductDivision": "rmhProductDivision", "rmhCategory": "rmhCategory", "rmhProductType": "rmhProductType" } } } } } } } }, { "operation": "shift", "spec": { "sourcingSizeCode3": { "*": { "@(2,groupModelNumber)": "[#2].groupModelNumber", "@": "[#2].&2", "@(2,retailClass)": "[#2].retailClass", "@(2,retailSubClass)": "[#2].retailSubClass", "@(2,retailDepartment)": "[#2].retailDepartment", "@(2,retailSubDepartment)": "[#2].retailSubDepartment", "@(2,rmhProductDivision)": "[#2].rmhProductDivision", "@(2,rmhCategory)": "[#2].rmhCategory", "@(2,rmhProductType)": "[#2].rmhProductType" } }, "activeIndicator": { "*": { "@": "[#2].&2" } }, "feasibilityIndicator": { "*": { "@": "[#2].&2" } }, // 当sku为空数组时,将基础字段组装成单个对象 "groupModelNumber": { "@": "temp.groupModelNumber" }, "groupArticleNumber": { "@": "temp.groupArticleNumber" }, "retailClass": { "@": "temp.retailClass" }, "retailSubClass": { "@": "temp.retailSubClass" }, "retailDepartment": { "@": "temp.retailDepartment" }, "retailSubDepartment": { "@": "temp.retailSubDepartment" }, "rmhProductDivision": { "@": "temp.rmhProductDivision" }, "rmhCategory": { "@": "temp.rmhCategory" }, "rmhProductType": { "@": "temp.rmhProductType" } } }, { "operation": "shift", "spec": { // 优先输出sku对应的数组 "*": { "*": "[]" }, // 若sku数组为空,则输出temp中的单个对象 "temp": { "@": "" } } }, { "operation": "remove", "spec": { "temp": "" } } ]
关键修改说明
- 默认sku数组:在
modify-overwrite-beta阶段,给article下的sku设置默认值为空数组,避免因字段不存在导致后续操作失败。 - 字段索引对齐:在第一个shift操作中,给sku的子字段加上
[&1]索引,确保每个sku项的字段能对应到正确的数组位置。 - 空sku场景处理:添加临时对象
temp存储基础字段,当sku数组为空时,将temp中的字段组装成单个对象输出;若sku存在,则优先输出sku对应的数组。 - 清理临时字段:最后用
remove操作删除临时对象temp,保证输出干净。
内容的提问来源于stack exchange,提问作者Thiyagaraj Narayanan
相关产品推荐
相关产品推荐

