使用Jolt Transform将扁平JSON转换为含多数组的嵌套JSON
Jolt转换规格调试求助
我正在编写Jolt转换规格,要把扁平JSON转换成包含多数组的嵌套JSON,但遇到了问题。试过参考示例但没解决,用Jolt测试工具调试,以下是输入、期望输出和当前使用的规格,求技术支持:
输入JSON
[ { "container_id": "a", "carrier_scac": "b", "location": "banglore", "state": "karnataka", "country": "India" }, { "container_id": "a", "carrier_scac": "b", "location": "pune", "state": "maharashtra", "country": "India" }, { "container_id": "c", "carrier_scac": "d", "location": "dharwad", "state": "kan", "country": "India" }, { "container_id": "c", "carrier_scac": "d", "location": "hubli", "state": "kant", "country": "India" } ]
期望输出JSON
[ { "load": { "container_id": "a", "carrier_scac": "b", "stops": [ { "location": "banglore", "state": "karnataka" }, { "location": "pune", "state": "maharashtra" } ] }, "containerInfo": { "country": "India" } }, { "load": { "container_id": "c", "carrier_scac": "d", "stops": [ { "location": "dharwad", "state": "kan" }, { "location": "hubli", "state": "kant" } ] }, "containerInfo": { "country": "India" } } ]
当前使用的Jolt规格
[ { "operation": "shift", "spec": { "*": { "container_id": "@(1,container_id).&", "carrier_scac": "@(1,container_id).&", "*": "@(1,container_id).stops[&1].&" } } }, { "operation": "modify-overwrite-beta", "spec": { "*": "=recursivelySquashNulls" } }, { "operation": "cardinality", "spec": { "*": { "container_id": "ONE", "carrier_scac": "ONE" } } }, { "operation": "shift", "spec": { "*": "" } } ]
解决方案:调整后的Jolt规格
[ { "operation": "shift", "spec": { "*": { "container_id": "@(1,container_id).load.&", "carrier_scac": "@(1,container_id).load.&", "location": "@(1,container_id).load.stops[&1].&", "state": "@(1,container_id).load.stops[&1].&", "country": "@(1,container_id).containerInfo.&" } } }, { "operation": "cardinality", "spec": { "*": { "load": { "container_id": "ONE", "carrier_scac": "ONE" }, "containerInfo": { "country": "ONE" } } } }, { "operation": "shift", "spec": { "*": "" } } ]
关键调整说明:
- 第一步Shift操作:明确指定每个字段的目标层级,将
container_id、carrier_scac归入load节点,location和state归入load.stops数组,country单独放入containerInfo节点,同时通过@(1,container_id)作为分组键,确保相同container_id的记录被聚合到同一组。 - Cardinality操作:针对分组后重复的唯一标识字段(container_id、carrier_scac、country)设置为
ONE,确保每个分组只保留一个值,避免字段被转为数组。 - 最后一步Shift操作:将以container_id为键的对象结构转换为数组,匹配期望的输出格式。
内容的提问来源于stack exchange,提问作者Thiyagaraj Narayanan
相关产品推荐
相关产品推荐

