如何编写JOLT Spec实现JSON按指定字段分组转换为目标结构
实现方案
核心思路
JOLT通过shift操作的通配符匹配+反向引用能力实现按字段值分组,不需要显式编写字段值比较逻辑:
- 用
*匹配productOffering.id的字段值作为分组key - 相同key的数据会被自动聚合到同一节点,完成按id相等的分组逻辑
- 分组完成后再把聚合后的对象转换为数组格式
示例输入JSON
[ { "productOffering": { "id": "po_001", "name": "5G套餐", "description": "个人5G通信套餐" }, "productSpecification": { "id": "ps_001", "description": "100G流量包" } }, { "productOffering": { "id": "po_001", "name": "5G套餐", "description": "个人5G通信套餐" }, "productSpecification": { "id": "ps_002", "description": "200分钟通话包" } }, { "productOffering": { "id": "po_002", "name": "家庭宽带套餐", "description": "1000M家庭宽带" }, "productSpecification": { "id": "ps_003", "description": "光猫设备" } } ]
可用的JOLT转换Spec
[ // 按productOffering.id分组,聚合同组的公共字段和产品规格数据 { "operation": "shift", "spec": { "*": { "productOffering": { "id": { "*": { // 保留productOffering的公共字段,同组只存一次 "@2,name": "&1.name", "@2,description": "&1.description", "&": "&1.id", // 聚合productSpecification到products数组 "@3,productSpecification.id": "&1.products[].id", "@3,productSpecification.description": "&1.products[].description" } } } } } }, // 把分组后的键值对转换为输出数组 { "operation": "shift", "spec": { "*": "[]" } } ]
转换后输出结果
[ { "id": "po_001", "name": "5G套餐", "description": "个人5G通信套餐", "products": [ { "id": "ps_001", "description": "100G流量包" }, { "id": "ps_002", "description": "200分钟通话包" } ] }, { "id": "po_002", "name": "家庭宽带套餐", "description": "1000M家庭宽带", "products": [ { "id": "ps_003", "description": "光猫设备" } ] } ]
补充说明
如果需要自定义字段值比较规则(比如按id前缀分组、按多个字段组合分组),可以先通过modify-overwrite-beta操作计算出自定义的分组标识,再按标识分组即可。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

