JOLT转换问题:父字段无法按需求分配给子节点求助
JOLT转换问题排查与修正方案
针对你遇到的几个核心问题,逐一拆解并给出落地的修正方案:
1. 父级字段分配给每个子签署人
问题根源:未通过shift操作将父级的role、order、signatureProviderName下沉到每个签署人节点,导致多个签署人共享父级字段,合并为单一数组条目。
修正方法:在shift阶段,用*遍历signers数组的每个元素,通过@(N,字段名)回溯父级节点获取字段值,再用[&1]绑定数组索引,确保每个签署人对应独立条目。
示例片段:
{ "signers": { "*": { "@(2,role)": "formatedData.[&1].role", // 向上回溯2层取父级role "@(2,order)": "formatedData.[&1].order", "@(2,signatureProviderName)": "formatedData.[&1].signatureProvider", // 同时完成重命名 "entityId": "formatedData.[&1].entityId" // 其他签署人字段按需映射 } } }
2. 保留完整rawData
问题根源:未在shift阶段将整个输入对象映射到rawData节点。
修正方法:直接用@引用整个输入JSON,映射到rawData:
"@": "rawData"
3. signatureProviderName重命名为signatureProvider
问题根源:字段映射时未指定新键名。
修正方法:在shift阶段映射该字段时,将目标键设为signatureProvider,如上述第1点示例所示。
4. 字符串类型转为数值类型
问题根源:JOLT默认保留原始数据类型,需主动触发类型转换。
修正方法:添加modify-overwrite-beta阶段,用=toInteger或=toDouble函数转换目标字段:
{ "operation": "modify-overwrite-beta", "spec": { "formatedData": { "*": { "entityId": "=toInteger", "order": "=toInteger" // 其他需转数值的字段可追加 } } } }
完整修正后的JOLT规范示例
[ { "operation": "shift", "spec": { "@": "rawData", // 保留完整输入JSON "role": "temp.role", "order": "temp.order", "signatureProviderName": "temp.signatureProvider", "signers": { "*": { "@(2,temp.role)": "formatedData.[&1].role", "@(2,temp.order)": "formatedData.[&1].order", "@(2,temp.signatureProvider)": "formatedData.[&1].signatureProvider", "entityId": "formatedData.[&1].entityId", "name": "formatedData.[&1].name", "email": "formatedData.[&1].email" } } } }, { "operation": "modify-overwrite-beta", "spec": { "formatedData": { "*": { "entityId": "=toInteger", "order": "=toInteger" } } } }, { "operation": "remove", "spec": { "temp": "" // 清理临时节点 } } ]
关键说明
- 用
temp临时节点暂存父级字段,避免重复写多层回溯路径,提升可读性。 modify-overwrite-beta的类型转换函数仅对字符串格式的数字有效,若原始数据非数字字符串需提前处理。remove阶段清理临时节点,保证输出结构整洁。
内容的提问来源于stack exchange,提问作者Albatross
相关产品推荐
相关产品推荐

