Jolt规范编写求助:将单个或多个Score统一转换为Scores数组
解决Jolt中单个Score转Scores数组的问题
我来帮你搞定这个转换需求!核心目标是把每个Team里的Score(不管是单个对象还是数组)统一转成Scores数组,同时保留Team的其他字段,并添加指定的默认字段。
问题分析
你之前的Jolt规范主要有两个问题:
- 没有正确保留Team成员的原有字段(比如HV、ID这些)
- 没有处理单个
Score对象转数组的场景,导致单个Score无法变成数组格式
正确的Jolt规范
我们可以通过Shift + Cardinality + Default三个操作组合来实现需求:
[ // 第一步:提取需要的字段,并重命名Score为Scores { "operation": "shift", "spec": { "*": { "ScoreInfo": { "Team": { "*": { // 保留当前Team成员的所有原有字段(除了Score) "@": "ScoreInfo.Team.&1", // 将Score字段的值映射到Scores字段 "Score": { "@": "ScoreInfo.Team.&2.Scores" } } } } } } }, // 第二步:强制将Scores转为数组(关键!处理单个Score的情况) { "operation": "cardinality", "spec": { "ScoreInfo": { "Team": { "*": { "Scores": "MANY" } } } } }, // 第三步:添加默认字段 { "operation": "default", "spec": { "Type": "ScoreInfo", "Datasource": "Vendor" } } ]
每一步的作用解释
Shift操作:
- 遍历输入数组中的元素,只提取
ScoreInfo下的Team字段(符合你的期望输出,丢弃了StadiumID等不需要的字段) - 对每个Team成员,保留其原有字段(比如HV、ID、NameS等),同时把
Score字段的值映射到新的Scores字段
- 遍历输入数组中的元素,只提取
Cardinality操作:
- 使用
MANY规则强制将Scores字段转为数组。这一步是核心:如果原来的Score是单个对象,会自动包裹成数组;如果已经是数组,则保持不变,完美统一格式
- 使用
Default操作:
- 为输出添加指定的默认字段
Type和Datasource
- 为输出添加指定的默认字段
测试结果
用你的输入数据测试这个规范,就能得到完全符合你要求的输出:单个Score被转为数组,多个Score的数组保持原样,同时保留了所有需要的字段和默认字段。
内容的提问来源于stack exchange,提问作者emerson
相关产品推荐
相关产品推荐

