基于条件移除JSON对象的JOLT转换需求及问题求助
JOLT条件移除数组解决方案(避免null值)
需求回顾
当输入JSON的action字段值不为CREATE时,完全移除body下的Activity数组;action为CREATE时保留原结构,且不能产生null值。
正确JOLT规则
使用shift操作结合条件判断,仅在action=CREATE时映射Activity字段,否则忽略该字段(自然移除):
[ { "operation": "shift", "spec": { "header": "header", "action": "action", "body": { "*": "body.&", "Activity": { "@(2,action)": { "CREATE": { "@": "body.Activity" } } } } } } ]
规则说明
header和action字段直接映射到输出对应位置,保留原结构body.*: 保留body下除Activity外的所有字段,&代表原字段名body.Activity的处理逻辑:通过@(2,action)获取顶层action值,仅当值为CREATE时,才将Activity数组映射到输出的body.Activity位置;非CREATE时不做映射,数组直接被移除,不会产生null
测试示例
输入(action=UPDATE)
{ "header": { "id": "123" }, "body": { "name": "test", "Activity": [{"type": "run"}] }, "action": "UPDATE" }
输出(无Activity数组)
{ "header": {"id": "123"}, "action": "UPDATE", "body": {"name": "test"} }
输入(action=CREATE)
{ "header": { "id": "123" }, "body": { "name": "test", "Activity": [{"type": "run"}] }, "action": "CREATE" }
输出(保留Activity数组)
{ "header": {"id": "123"}, "action": "CREATE", "body": { "name": "test", "Activity": [{"type": "run"}] } }
问题原因
之前的规则可能直接对Activity做了全局映射,当条件不满足时返回null。而上述规则通过条件分支仅在符合要求时才映射该字段,未匹配的分支不会生成任何输出,自然避免了null值。
内容的提问来源于stack exchange,提问作者Scarlett John
相关产品推荐
相关产品推荐

