JOLT JSON转换:按动态属性值过滤数组失效问题排查
JOLT动态值过滤数组失效问题解决
问题说明
在JOLT JSON转换场景中,使用静态值过滤数组时功能正常,但通过动态值(如输入中的selected_key字段)进行过滤时,过滤逻辑失效,所有数组项均被保留到输出中。
输入JSON
{ "selected_key": "key2", "keys": [ { "name": "value1", "key": "key1" }, { "name": "value21", "key": "key2" }, { "name": "value22", "key": "key2" }, { "name": "value3", "key": "key3" }, { "name": "value4", "key": "key4" } ] }
原JOLT规格(失效版本)
[ { "operation": "shift", "spec": { "keys": { "*": { "key": { "@(4,selected_key)": { "@2": "test" } } } } } } ]
预期输出
{ "test": [ { "name": "value21", "key": "key2" }, { "name": "value22", "key": "key2" } ] }
实际输出(过滤失效)
{ "test": [ { "name": "value1", "key": "key1" }, { "name": "value21", "key": "key2" }, { "name": "value22", "key": "key2" }, { "name": "value3", "key": "key3" }, { "name": "value4", "key": "key4" } ] }
解决方法
原规格失效的核心原因是路径引用错误:在keys.*.key层级下,根节点的selected_key需要通过@(3,selected_key)引用(从当前key节点往上数3层到达根节点),而非@(4,selected_key)。以下是修正后的JOLT规格:
方案1:简洁版shift操作
[ { "operation": "shift", "spec": { "keys": { "*": { "@(2,key)": { "@(3,selected_key)": { "@2": "test[]" } } } } } } ]
方案2:临时变量辅助(更易理解)
[ { "operation": "shift", "spec": { "selected_key": "&", "keys": { "*": { "@": "temp[]" } } } }, { "operation": "shift", "spec": { "temp": { "*": { "key": { "@(3,selected_key)": { "@2": "test[]" } } } } } }, { "operation": "remove", "spec": ["selected_key", "temp"] } ]
原理说明
- 方案1中,
@(2,key)获取当前数组项的key值,@(3,selected_key)获取根节点的动态匹配值,只有当两者相等时,才将当前数组项(@2)写入test数组。 - 方案2通过临时数组
temp暂存所有keys项,再基于selected_key进行匹配过滤,最后移除临时变量,逻辑更直观。
内容的提问来源于stack exchange,提问作者Jeya Prakash
相关产品推荐
相关产品推荐

