如何编写兼容单元素与元素数组的JOLT Transform规范?
统一JOLT Spec处理数组/单个元素输入
我调用的API返回的数据中,rating字段存在两种格式:可能是包含多个对象的数组,也可能是单个对象。目前我有两个分别对应这两种情况的JOLT转换规则,但需要一个统一的Spec来处理两种输入,输出结构完全一致。
输入1(数组格式)
{ "rating": [ { "primary-value": 3, "id": 1 }, { "quality-value": 3, "id": 2 } ] }
原对应Spec
[ { "operation": "shift", "spec": { "rating": { "*": { "*": "out[&1].fields.&" } } } } ]
原输出1
{ "out": [ { "fields": { "primary-value": 3, "id": 1 } }, { "fields": { "quality-value": 3, "id": 2 } } ] }
输入2(单个对象格式)
{ "rating": { "primary-value": 3, "id": 1 } }
原对应Spec
[ { "operation": "shift", "spec": { "rating": { "*": "out[0].fields.&" } } } ]
期望输出2
{ "out": [ { "fields": { "primary-value": 3, "id": 1 } } ] }
统一JOLT Spec实现
可行,只需要先将rating字段统一转换为数组格式,再复用原数组处理逻辑即可,完整Spec如下:
[ // 第一步:将rating统一转为数组(单个对象自动包装为数组) { "operation": "shift", "spec": { "rating": { "*": "rating[&1]", "@": "rating[0]" } } }, // 第二步:复用原数组处理逻辑生成目标输出 { "operation": "shift", "spec": { "rating": { "*": { "*": "out[&1].fields.&" } } } } ]
原理说明
- 第一步
shift操作中:"*": "rating[&1]":当rating是数组时,匹配每个数组元素,按原索引存入新的rating数组;"@": "rating[0]":当rating是单个对象时,将整个对象存入rating[0],自动包装为数组;
- 第二步直接复用原数组处理的Spec,此时无论输入是数组还是单个对象,都已统一为数组格式,输出结构完全一致。
内容的提问来源于stack exchange,提问作者user3794709
相关产品推荐
相关产品推荐

