复杂Jolt转换需求:向数组元素注入非HD循环数据
Jolt 处理EDI数据:生成HD驱动的关联数组解决方案
问题场景
输入EDI结构包含1个INS-2000_loop元素,其下包含多个HD-2300_loop子元素,需生成与HD-2300_loop数量匹配的输出数组,每个数组项包含:
- 对应
HD-2300_loop的完整数据(重命名为L2300) INS-2000_loop中除HD-2300_loop外的所有子数据(重命名为L2000)
示例输入
{ "INS-2000_loop": { "INS": "INS001", "REF": "REF001", "DTM": "DTM001", "HD-2300_loop": [ { "HD": "HD001", "CLM": "CLM001" }, { "HD": "HD002", "CLM": "CLM002" } ] } }
目标输出
[ { "L2000": { "INS": "INS001", "REF": "REF001", "DTM": "DTM001" }, "L2300": { "HD": "HD001", "CLM": "CLM001" } }, { "L2000": { "INS": "INS001", "REF": "REF001", "DTM": "DTM001" }, "L2300": { "HD": "HD002", "CLM": "CLM002" } } ]
最终Jolt Shift Spec
[ { "operation": "shift", "spec": { "INS-2000_loop": { "HD-2300_loop": { "*": { // 将当前HD-2300_loop元素映射到对应数组项的L2300字段 "@": "[&1].L2300", // 注入上层INS-2000_loop的非HD数据到L2000 "@3,INS-2000_loop": { // 排除HD-2300_loop字段,不纳入L2000 "HD-2300_loop": null, // 将其余字段映射到对应数组项的L2000下,保留原键名 "*": "[&3].L2000.&" } } } } } } ]
关键逻辑解析
- @3路径注入:
@3,INS-2000_loop表示从当前*(HD数组索引节点)向上回溯3层,精准定位到根节点下的INS-2000_loop,获取其完整内容用于后续处理。 - 排除HD子项:通过
"HD-2300_loop": null规则,直接过滤掉该字段,避免冗余数据进入L2000。 - 数组索引匹配:
[&1]和[&3]分别引用HD数组的索引,确保每个L2300和对应的L2000被映射到同一个输出数组项中。 - 重命名规则:通过
.L2300和.L2000后缀,直接完成字段重命名需求。
Jolt &运算符速查表
| 语法 | 作用说明 |
|---|---|
& | 引用当前字段的键名,用于保留原字段名映射,如"*": "output.&" |
&n | 引用当前路径向上第n层的键名/索引,如在a.b.c.*节点下,&2指代c |
&(n,key) | 引用向上第n层中指定key的节点内容,用于精准定位上层特定字段 |
&0 | 等同于&,直接引用当前字段的键名 |
内容的提问来源于stack exchange,提问作者Abhai Raj Llewellyn
相关产品推荐
相关产品推荐

