如何定义无需硬编码属性名的JOLT通用转换规则
通用JOLT转换规则
[ { "operation": "shift", "spec": { "data": { "*": { // 先复制原对象所有属性到输出数组对应位置 "*": "[&1].&", // 再写入newVals的属性,同名字段会自动覆盖原属性值 "@(3,newVals)": { "*": "[&2].&" } } } } } ]
规则说明
- 仅需一层shift操作即可完成需求,无需额外处理步骤,核心逻辑是JOLT的shift操作中,同路径下后写入的字段会自动覆盖先写入的字段值
"*": "[&1].&"遍历data数组每个对象的所有原生属性,原样输出到结果数组对应下标的对象中@(3,newVals)向上回溯3层拿到根节点的newVals对象,遍历它的所有属性写入到结果数组对应下标的同名属性,因为这一步执行在原属性复制之后,所以会自动覆盖原有的相同属性值,newVals中不存在的属性则保留原值
效果验证
这套规则完全不需要硬编码任何属性名,可适配任意属性名的输入:
- 第一个含B/C属性的输入样例执行后,输出结果和你预期的完全一致
- 第二个含E/F属性的输入样例执行后,输出结果如下:
[ { "A": 1, "E": "new val", "F": 7 } ]
备注:如果不需要新增newVals里存在但data原对象不存在的属性,可以在shift操作前增加过滤逻辑只保留共有的属性,如果你没有类似需求,上面的规则已经完全满足使用场景。
内容的提问来源于stack exchange,提问作者Zumin
相关产品推荐
相关产品推荐

