如何用Jolt Spec将父对象所有键合并到数组内子对象
问题:合并父对象字段与候选对象数组中的每个元素
需求
- 输入是一个数组,每个元素包含大量字段,以及一个
active_candidates_group数组(存储候选对象) - 需要将每个候选对象与父对象的所有字段合并,生成新的输出数组
- 注意:父对象字段数量多,不能硬编码;父对象与候选对象无重复字段;字段顺序无关紧要
输入示例
[ { "id": 123, "name": "foo", // { 数百个其他字段 } "active_candidates_group": [ { "person_id": 123, "person_name": "john" // { 候选对象专属字段,无重复 } }, { "person_id": 321, "person_name": "bob" // { 候选对象专属字段,无重复 } } ] } ]
期望输出
[ { "id": 123, "name": "foo", // { 父对象的数百个其他字段 } "person_id": 123, "person_name": "john" // { 候选对象其他字段 } }, { "id": 123, "name": "foo", // { 父对象的数百个其他字段 } "person_id": 321, "person_name": "bob" // { 候选对象其他字段 } } ]
你尝试的Jolt Spec
[ { "operation": "shift", "spec": { "*": { // 遍历输入数组中的每个对象 "active_candidates_group": { // 匹配active_candidates_group键 "*": { // 遍历active_candidates_group内的每个对象 "@2": "&2[&1]", // 将父对象所有键复制到输出数组对应索引位置 "*": "&2[&1].&" // 将当前候选对象复制到输出数组对应索引位置 } } } } }, { "operation": "remove", "spec": { "active_candidates_group": { "*": { "active_candidates_group": "" } } } } ]
修正后的Jolt方案
原Spec的问题:shift操作里的@2会把父对象的active_candidates_group字段也复制到结果里,而且后续的remove路径错误,无法清理这个多余字段。下面提供两个可行的修正方案:
方案一:临时存储父对象字段(更稳妥)
[ { "operation": "shift", "spec": { "*": { // 先把父对象中除了active_candidates_group的所有字段存到临时节点 "*": "tmp_parent.&", "active_candidates_group": { "*": { // 合并临时存储的父对象字段 "@(2,tmp_parent)": "&2[&1]", // 合并当前候选对象的所有字段 "*": "&2[&1].&" } } } } }, { // 将合并后的数组作为最终输出 "operation": "shift", "spec": { "active_candidates_group": "[]" } } ]
- 第一步通过临时节点
tmp_parent隔离父对象的非候选数组字段,避免把active_candidates_group带入结果 - 第二步直接提取合并好的数组作为根输出,结构清晰且避免冗余操作
方案二:直接清理冗余字段(更简洁)
如果确定父对象和候选对象无重复字段,也可以用这个简化写法:
[ { "operation": "shift", "spec": { "*": { "active_candidates_group": { "*": { // 复制父对象所有字段 "@2": "&3[&1]", // 复制候选对象字段,覆盖可能的冗余 "*": "&3[&1].&", // 直接移除父对象带来的active_candidates_group字段 "@2,active_candidates_group": null } } } } } ]
- 利用
@2,active_candidates_group": null在shift阶段直接清理冗余字段,不需要额外的remove操作
内容的提问来源于stack exchange,提问作者Ben Cooper
相关产品推荐
相关产品推荐

