JOLT传递默认值时出现数组重复问题,求解决方案
JOLT默认值数组重复+cardinality报错问题解决
核心问题拆解
默认值在数组里重复,本质是默认值规则被数组的每个元素触发了;而"*":"ONE"配置报错,基本是因为这个全局匹配的写法和当前规则结构冲突,或者层级设置不对。
具体解决步骤
1. 调整默认值规则的层级
别把默认值写在数组遍历的"*"节点下,避免每个数组元素都触发默认值生成。
- 错误示例(会导致重复):
[ { "operation": "default", "spec": { "goods": { "*": { "stock": 0 } } } } ]
- 正确示例(仅针对缺失字段或空数组设置):
[ // 数组为空时设置默认空数组 { "operation": "default", "spec": { "goods": [] } }, // 仅当数组元素的stock字段缺失时补默认值 { "operation": "modify-overwrite-beta", "spec": { "goods": { "*": { "stock": "=notNull(@(1), 0)" } } } } ]
2. 修正cardinality规则的写法
cardinality的"*":"ONE"不能全局乱用,要精准指定目标字段路径:
- 错误示例(全局匹配会干扰其他字段导致报错):
[ { "operation": "cardinality", "spec": { "*": "ONE" } } ]
- 正确示例(仅约束特定字段为单值):
[ { "operation": "cardinality", "spec": { "goods": { "*": { "stock": "ONE" } } } } ]
3. 联动shift和default规则
先通过shift整理好数组结构,再用default补全缺失值,避免重复触发:
[ // 先整理数组结构 { "operation": "shift", "spec": { "productList": { "*": "goods[]" } } }, // 补全元素缺失字段的默认值 { "operation": "default", "spec": { "goods": { "*": { "status": "available" } } } }, // 约束特定字段为单值 { "operation": "cardinality", "spec": { "goods": { "*": { "status": "ONE" } } } } ]
补充说明
如果以上方法没解决问题,需要提供完整的输入JSON、当前JOLT规则代码、具体报错信息,才能精准定位问题。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

