JSON转换规则问题:Validator状态未按预期更新
Jolt转换规则错误排查与修复
问题说明
输入JSON结构如下:
[ { "Validator": [ { "name": "API_Automation_Client", "guid": "8013091c-6f2e-46c4-b406-b11a4b78c628", "status": "NOT PUBLISHED" }, { "name": "HNCServerTest", "guid": "8a73c938-8687-4de2-9020-0a5bed37f91d", "status": "NOT PUBLISHED" }, { "name": "Time", "guid": "Time", "status": "NOT PUBLISHED" }, { "name": "SV-p1", "guid": "aa2a1f6a-165b-409b-978e-ee436d0ae81c", "status": "NOT PUBLISHED" } ], "selectedRelease": {}, "Replay": [], "entity": "Validator", "publishedString": "SV-p1,Time,API_Automation_Client" } ]
需求是:若Validator元素的name存在于publishedString中,将其status设为"PUBLISHED",否则保持"NOT PUBLISHED"。原Jolt转换规则执行后,所有Validator的status均为"NOT PUBLISHED",不符合预期。
错误原因
原规则存在两个核心问题:
split函数参数顺序颠倒:Jolt的split函数语法为=split(<分隔符>, <目标字符串>),原规则中写成=split(@(2,publishedString), ','),将目标字符串与分隔符顺序搞反,导致无法正确拆分出已发布名称数组,后续contains判断永远返回false。- 多余的
shift操作:输入JSON结构已经符合处理要求,无需额外复制结构,增加了不必要的复杂度。
修正后的Jolt规则
[ { "operation": "modify-overwrite-beta", "spec": { "*": { "Validator": { "*": { "status": "=contains(=split(',', @(2,publishedString)), @(0,name)) ? 'PUBLISHED' : 'NOT PUBLISHED'" } } } } } ]
规则说明
- 移除了多余的
shift操作,直接通过modify-overwrite-beta处理status字段。 - 修正
split函数参数顺序:=split(',', @(2,publishedString))先传入分隔符',',再传入目标字符串publishedString,正确拆分出已发布名称数组。 - 通过
contains函数判断当前Validator的name是否在拆分后的数组中,根据结果设置对应status。
验证结果
执行修正后的规则后,输出JSON完全符合预期:
[ { "Validator": [ { "name": "API_Automation_Client", "guid": "8013091c-6f2e-46c4-b406-b11a4b78c628", "status": "PUBLISHED" }, { "name": "HNCServerTest", "guid": "8a73c938-8687-4de2-9020-0a5bed37f91d", "status": "NOT PUBLISHED" }, { "name": "Time", "guid": "Time", "status": "PUBLISHED" }, { "name": "SV-p1", "guid": "aa2a1f6a-165b-409b-978e-ee436d0ae81c", "status": "PUBLISHED" } ], "selectedRelease": {}, "Replay": [], "entity": "Validator", "publishedString": "SV-p1,Time,API_Automation_Client" } ]
内容的提问来源于stack exchange,提问作者Alisha Sharan
相关产品推荐
相关产品推荐

