如何使用JOLT将字段值复制到另一字段并保留原有文档结构
JOLT字段复制并保留原文档结构的正确配置方法
需求:将JSON对象中contact.id的值复制到contact.userId字段,同时完整保留原有文档结构(包括其他所有节点和字段)。
待转换JSON
{ "contact": { "name": "Foo", "id": "123456", "phone": "231-123" }, "event": { "name": "create", "type": "test" } }
期望输出
{ "contact": { "name": "Foo", "id": "123456", "userId": "123456", "phone": "231-123" }, "event": { "name": "create", "type": "test" } }
错误配置分析
你尝试的JOLT规格存在两个核心问题:
- 字段映射逻辑完全反转:试图将
contact.userId的值赋值给contact.id,与需求完全相反; - 单独定义
contact节点的处理规则后,覆盖了"*": "&"对contact节点的保留逻辑,导致原有contact字段全部丢失,仅保留未被覆盖的event节点。
错误配置:
[ { "operation": "shift", "spec": { "*": "&", "contact": { "userId": "contact.id" } } } ]
正确JOLT配置方案
使用shift操作符,先全局保留所有原有节点,再针对contact节点单独处理字段复制逻辑:
[ { "operation": "shift", "spec": { "*": "&", // 保留所有顶层节点(contact、event)的原有结构 "contact": { "@id": "&1.userId", // 将contact.id的值复制到contact.userId "*": "&1.&" // 保留contact节点下的所有原有字段 } } } ]
配置说明
"*": "&":通配符匹配所有顶层节点,&表示将节点原样保留到输出的对应位置;"@id": "&1.userId":@id引用当前contact节点下的id字段值,&1代表父级节点(即contact),最终将值赋值给contact.userId;"*": "&1.&":通配符匹配contact下的所有原有字段,&1.&表示将字段原样保留到contact节点的对应位置。
内容的提问来源于stack exchange,提问作者Rafael Carrillo
相关产品推荐
相关产品推荐

