Jolt实现非空判断后新增字段问题(含数组场景)
可行的Jolt转换规则
核心需求回顾
仅当cp1/cp2为非空对象时,将同级的no1字段注入到其内部;若为null则保留原null值,不做修改。
单对象场景(输入为单个data对象)
输入示例
{ "data": { "no1": 12345, "cp1": { "cp1_sub1": "sub1", "cp2_sub2": "sub2" }, "cp2": null } }
Jolt规则
[ // 第一步:保留原始cp1/cp2(含null值),避免后续操作丢失 { "operation": "shift", "spec": { "data": { "no1": "data.no1", "cp1": { "@": "data.cp1" }, "cp2": { "@": "data.cp2" } } } }, // 第二步:仅向非空的cp1/cp2注入no1字段 { "operation": "modify-overwrite-beta", "spec": { "data": { "cp1": { "=notNull": ["@(2,no1)", null], "no1": "=if(@(1,=notNull), @(2,no1))" }, "cp2": { "=notNull": ["@(2,no1)", null], "no1": "=if(@(1,=notNull), @(2,no1))" } } } }, // 第三步:清理临时生成的=notNull字段 { "operation": "remove", "spec": { "data": { "cp1": { "=notNull": "" }, "cp2": { "=notNull": "" } } } } ]
输出结果
{ "data": { "no1": 12345, "cp1": { "cp1_sub1": "sub1", "cp2_sub2": "sub2", "no1": 12345 }, "cp2": null } }
数组场景(输入为data数组)
输入示例
{ "abc": "def", "data": [ { "no1": 12345, "cp1": { "cp1_sub1": "sub1", "cp2_sub2": "sub2" }, "cp2": null }, { "no1": 56789, "cp1": null, "cp2": { "cp3_sub1": "sub1", "cp3_sub2": "sub2" } } ] }
Jolt规则
在单对象规则基础上,对数组元素使用*通配符遍历处理:
[ // 第一步:保留原始字段(含数组元素的null值) { "operation": "shift", "spec": { "abc": "abc", "data": { "*": { "no1": "data[&1].no1", "cp1": { "@": "data[&2].cp1" }, "cp2": { "@": "data[&2].cp2" } } } } }, // 第二步:向数组中每个元素的非空cp1/cp2注入no1 { "operation": "modify-overwrite-beta", "spec": { "data": { "*": { "cp1": { "=notNull": ["@(2,no1)", null], "no1": "=if(@(1,=notNull), @(2,no1))" }, "cp2": { "=notNull": ["@(2,no1)", null], "no1": "=if(@(1,=notNull), @(2,no1))" } } } } }, // 第三步:清理临时字段 { "operation": "remove", "spec": { "data": { "*": { "cp1": { "=notNull": "" }, "cp2": { "=notNull": "" } } } } } ]
输出结果
{ "abc": "def", "data": [ { "no1": 12345, "cp1": { "cp1_sub1": "sub1", "cp2_sub2": "sub2", "no1": 12345 }, "cp2": null }, { "no1": 56789, "cp1": null, "cp2": { "cp3_sub1": "sub1", "cp3_sub2": "sub2", "no1": 56789 } } ] }
规则关键逻辑说明
- Shift操作:优先保留原始
cp1/cp2的所有值(包括null),避免后续修改操作误删null字段。 - Modify操作:
- 用
=notNull判断当前cp1/cp2是否为非空对象,生成临时标记; - 通过
=if条件判断:仅当临时标记有效(即目标是对象)时,注入同级的no1值。
- 用
- Remove操作:清理临时生成的
=notNull字段,保证输出结构整洁。
内容的提问来源于stack exchange,提问作者Ketan Bhavsar
相关产品推荐
相关产品推荐

