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

适配有无嵌套数组场景的动态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": ""
    }
  }
]

关键修改说明

  1. 默认sku数组:在modify-overwrite-beta阶段,给article下的sku设置默认值为空数组,避免因字段不存在导致后续操作失败。
  2. 字段索引对齐:在第一个shift操作中,给sku的子字段加上[&1]索引,确保每个sku项的字段能对应到正确的数组位置。
  3. 空sku场景处理:添加临时对象temp存储基础字段,当sku数组为空时,将temp中的字段组装成单个对象输出;若sku存在,则优先输出sku对应的数组。
  4. 清理临时字段:最后用remove操作删除临时对象temp,保证输出干净。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:36:58