如何使用JOLT根据通用键值数组合并对象?
JOLT合并同
foo_name值的对象(保留首次出现的键值) 输入JSON
{ "people": [ { "foo_name": "jack", "id": 123, "some_attr1": "val1" }, { "foo_name": "bob", "id": 456, "some_other_attr1": "val2" }, { "foo_name": "jack", "cool_attr1": "val3", "not_cool_attr1": "val4", "some_attr1": "vvaaalllllll" } ] }
期望输出
{ "people": [ { "foo_name": "jack", "id": 123, "some_attr1": "val1", // 若存在重复键,保留第一个值 "cool_attr1": "val3", // 合并后键的顺序无关紧要 "not_cool_attr1": "val4" }, { "foo_name": "bob", "id": 456, "some_other_attr1": "val2" } ] }
需求说明
- 按
foo_name的值分组合并对象,foo_name的具体值预先未知 - 相同
foo_name的对象合并后,重复的键保留首次出现的值 - 合并后对象的键顺序不做要求
当前尝试的JOLT规则
[ { "operation": "shift", "spec": { "people": { // 仅处理people数组 "*": { // 遍历每个元素 "foo_name": { // 按foo_name分组 "*": { "@2": "&[]" } } } } } } ]
正确的JOLT规则
[ // 反转数组,让原首个元素最后处理,确保其键值能覆盖后续同foo_name的元素 { "operation": "modify-overwrite-beta", "spec": { "people": "=reverse(@)" } }, // 按foo_name分组,合并所有键值对 { "operation": "shift", "spec": { "people": { "*": { "*": "&2_&(1,foo_name).&" } } } }, // 将分组后的对象转换为数组 { "operation": "shift", "spec": { "people_*": "people[]" } } ]
规则解释
- 反转数组:利用JOLT中「后处理的键值会覆盖先处理的」特性,反转后原数组中首次出现的jack对象会最后被处理,其键值会覆盖后续jack对象的重复键,从而保留初始值。
- 分组合并:通过
&2_&(1,foo_name)将每个元素的键值对映射到以people_foo_name值为键的对象下,自动合并同foo_name的所有键值对。 - 转数组:将所有分组后的对象收集到
people数组中,得到最终的合并结果。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

