如何使用Jolt Spec实现基于ID匹配的JSON数组合并转换?
Jolt转换:将list1匹配ID的对象替换list2的idList
原始输入JSON
{ "data":{ "list1":[ { "id":"1", "description":"abc..", "title":"abc" }, { "id":"2", "description":"hello..", "title":"hello" }, { "id":"3", "description":"hello..", "title":"hello" }, { "id":"4", "description":"hello..", "title":"hello" }, { "id":"5", "description":"hello..", "title":"hello" }, { "id":"6", "description":"hello..", "title":"hello" } ], "list2":[ { "info":"this is list2", "idList":[ "1", "3" ] }, { "info":"this is list2", "idList":[ "2", "4" ] } ] } }
期望输出JSON
{ "res":{ "data":[ { "info":"this is list2", "idList":[ { "id":"1", "description":"abc..", "title":"abc" }, { "id":"3", "description":"hello..", "title":"hello" } ] }, { "info":"this is list2", "idList":[ { "id":"2", "description":"hello..", "title":"hello" }, { "id":"4", "description":"hello..", "title":"hello" } ] } ] } }
尝试的Jolt Spec(仅保留info字段,未正确合并)
[ { "operation": "shift", "spec": { "data": { "list1": { "*": { "id": { "@(3,list2[&].idList)": { "@(4,list2[&].idList)": "res.data[&3].idList" } } } }, "list2": { "*": { "info": "res.data[&1].info" } } } } } ]
正确的Jolt Spec
[ // 第一步:将list1转换为以id为键的映射,方便后续匹配 { "operation": "shift", "spec": { "data": { "list1": { "*": { "@": "idMap.@id" } }, "data": { "list2": "@" } } } }, // 第二步:处理list2,用idMap替换idList中的ID为完整对象,构造目标结构 { "operation": "shift", "spec": { "data": { "list2": { "*": { "info": "res.data[&1].info", "idList": { "*": { "@(3,idMap.&)": "res.data[&4].idList[&1]" } } } } } } }, // 第三步:移除临时的idMap字段 { "operation": "remove", "spec": { "idMap": "" } } ]
说明
- 第一步(shift):把list1的每个对象按id存入
idMap,形成id: 对象的键值对,后续可通过ID直接引用对应对象。 - 第二步(shift):遍历list2的每个元素,保留
info字段;同时遍历idList中的每个ID,通过@(3,idMap.&)引用第一步生成的idMap中对应ID的完整对象,替换原ID值。 - 第三步(remove):清除临时生成的
idMap字段,得到干净的目标结构。
内容的提问来源于stack exchange,提问作者aryakdangol
相关产品推荐
相关产品推荐

