Jolt转换:为存在的节点添加缺失键默认值,避免冗余节点
解决Jolt JSON转换中动态节点的默认值设置问题
输入请求Payload
{ "attributes": { "training": { "attr1": "somevalue", "attr2": "somevalue" }, "services": [ { "recommendedService": "medical", "providedOrInitiated": 1 }, { "recommendedService": "engineering", "providedOrInitiated": 0 } ] } }
期望输出Payload
{ "attributes": { "training": { // 仅当请求中接收该节点时转换 "training1": "somevalue", "training2": "somevalue" }, "services": { // 仅当请求中接收该节点时转换 "medicalProvided": 1, "engineeringProvided": 0, "caProvided": 0, // 未在请求中接收的缺失键全部设为0 "doctorProvided": 0, "teacherProvided": 0 } } }
当前Jolt转换Spec
[ { "operation": "shift", "spec": { "attributes": { "ParentID": "customAttributesMap.ParentID", "training": { "attr1": "attributes.training.training1", "attr2": "attributes.training.training2" }, "services": { "*": { "recommendedService": { "medical": { "@(2,providedOrInitiated)": "attributes.services.medicalProvided" }, "engineering": { "@(2,providedOrInitiated)": "attributes.services.engineeringProvided" } // 如何为缺失的输入字段设置默认值 } } } } } } ]
核心需求
- 仅转换请求中存在的节点,不存在的节点不生成输出
- 当
services节点存在时:请求中已有的服务映射为XXProvided并赋值对应providedOrInitiated值;预设的缺失服务(ca、doctor、teacher)默认设为0 - 拒绝使用
default操作,因为它会在请求无services节点时强制生成相关键
解决方案
结合shift完成基础映射,再通过modify-overwrite-beta做条件化默认值填充,确保仅在services节点存在时才补充默认值:
[ // 第一步:完成基础节点映射,仅保留输入中存在的节点 { "operation": "shift", "spec": { "attributes": { "ParentID": "customAttributesMap.ParentID", "training": { "attr1": "attributes.training.training1", "attr2": "attributes.training.training2" }, "services": { "*": { "recommendedService": { "medical": { "@(2,providedOrInitiated)": "attributes.services.medicalProvided" }, "engineering": { "@(2,providedOrInitiated)": "attributes.services.engineeringProvided" } } } } } } }, // 第二步:仅当services节点存在时,为缺失服务设置默认值0 { "operation": "modify-overwrite-beta", "spec": { "attributes": { "services": { "caProvided": ["=notNull(@(1,caProvided))", 0], "doctorProvided": ["=notNull(@(1,doctorProvided))", 0], "teacherProvided": ["=notNull(@(1,teacherProvided))", 0] } } } } ]
方案说明
- shift操作:严格按照输入节点生成映射结果,输入中不存在的节点(如无
training或services)不会在输出中生成对应结构 - modify-overwrite-beta操作:通过
notNull函数判断目标键是否已存在,不存在则赋值为0。由于该操作仅针对attributes.services路径生效,若输入无services节点,此路径不存在,操作不会触发,避免生成多余节点
内容的提问来源于stack exchange,提问作者pratik03
相关产品推荐
相关产品推荐

