使用JOLT提取并合并输入元素中数组内的异构对象问题求助
解决JOLT合并数组中属性不统一对象的问题
我明白你遇到的痛点了——当数组里的对象属性零散分布,要按某个键(比如id)把所有相关属性合并到一起,确实容易在JOLT里卡壳。我给你准备了一个贴合你场景的示例,还有对应的JOLT转换规则,一步步拆解给你看:
示例输入
[ { "id": "1", "name": "Alice", "email": "alice@example.com" }, { "id": "1", "age": 30, "phone": "123-456-7890" }, { "id": "2", "name": "Bob", "phone": "987-654-3210" }, { "id": "2", "email": "bob@example.com" } ]
期望输出
[ { "id": "1", "name": "Alice", "email": "alice@example.com", "age": 30, "phone": "123-456-7890" }, { "id": "2", "name": "Bob", "phone": "987-654-3210", "email": "bob@example.com" } ]
JOLT转换规范
[ // 第一步:按id分组,把相同id的对象归到同一数组下 { "operation": "shift", "spec": { "*": { "id": "@(1,id).id", "*": "@(1,id).&" } } }, // 第二步:合并每个id下的对象数组,把所有属性整合到一个对象中 { "operation": "modify-overwrite-beta", "spec": { "*": { "*": "=mergeObjects(@(1))" } } }, // 第三步:把分组后的结构转换回数组格式 { "operation": "shift", "spec": { "*": "[]" } } ]
规则解释
Shift(分组阶段):
- 遍历输入数组的每个对象(
*),用@(1,id)获取当前对象的id值,作为分组的键 - 把
id字段和其他所有字段(*)都映射到对应id的分组下,这样相同id的所有属性会被收集到同一个对象数组里
- 遍历输入数组的每个对象(
Modify-Overwrite-Beta(合并阶段):
- 遍历每个id分组(
*),用=mergeObjects(@(1))函数把该分组下的对象数组合并成一个单独的对象,自动保留所有存在的属性,不会丢失零散分布的键
- 遍历每个id分组(
Shift(数组转换阶段):
- 把分组后的键值对结构重新转换为数组,得到最终的合并结果
这个方案完全适配你描述的“部分对象属性不统一”的场景,不管某个键只存在于少数对象中,都能被正确合并到对应id的对象里。
内容的提问来源于stack exchange,提问作者System.Cats.Lol
相关产品推荐
相关产品推荐

