如何在Jolt转换的if条件中添加for循环?
Jolt转换:条件判断结合循环实现需求
输入JSON
[{"sports": {"percent": "10%","feeType": [{"discount": 12345,"sport_fee_type": "Discounted fee","fee_details": [{"total": 1117.3,"sports_catagory": "Cricket"},{"total": 6187.79,"sports_catagory": "Football"}]},{"sport_fee_type": "Recurring fee","fee_details": [{"total": 1117.3,"sports_catagory": "Cricket sport"},{"total": 6187.79,"sports_catagory": "Football"}]},{"sport_fee_type": "Non Recurring fee","fee_details": [{"total": 1117.3,"sports_catagory": "Cricket"},{"total": 6187.79,"sports_catagory": "football"}]}]}}]
现有转换规则(Specs)
[{"operation": "shift","spec": {"*": {"@sports": {"@percent": "additionalInfo[#1].value","#percent": "additionalInfo[#1].property","@feeType": {"*": {"sport_fee_type": {"Discounted fee": {"#discountAmount": "additionalInfo[&3].property","@2,discount": ["additionalInfo[&3].value", "discountedPrice"],"@2,fee_details": {"*": {"total": ["billing.feeSummary[&5].sportsCategories[&1].amount"],"sports_catagory": "billing.feeSummary[&5].sportsCategories[&1].sportType"}},"#DISCOUNTED": "billing.feeSummary[#2].feeType"},"Non Recurring fee": {"@2,fee_details": {"*": {"total": "billing.feeSummary[&5].sportsCategories[&1].amount","sports_catagory": "billing.feeSummary[&5].sportsCategories[&1].sportType"}},"#NON_RECURRING": "billing.feeSummary[#4].feeType"},"Recurring fee": {"@2,fee_details": {"*": {"total": "billing.feeSummary[&5].sportsCategories[&1].amount","sports_catagory": "billing.feeSummary[&5].sportsCategories[&1].sportType"}},"#RECURRING": "billing.feeSummary[#4].feeType"}}}}}}},{"operation": "modify-overwrite-beta","spec": {"billing": {"feeSummary": {"*": {"sportsCategories": {"*": {"sportType": "=toUpper"}}}}}}},{"operation": "modify-overwrite-beta","spec": {"billing": {"feeSummary": {"*": {"sportsCategories": {"*": {"sportType": "=split(' ',@(1,&))"}}}}}}},{"operation": "modify-overwrite-beta","spec": {"billing": {"feeSummary": {"*": {"sportsCategories": {"*": {"sportType": "=join('_',@(1,&))"}}}}}}]
期望输出
{"additionalInfo": [{"value": "10%","property": "percent"},{"property": "discountAmount","value": 12345}],"discountedPrice": 12345,"billing": {"feeSummary": [{"sportsCategories": [{"amount": 1117.3,"sportType": "CRICKET"},{"amount": 6187.79,"sportType": "FOOTBALL"}],"feeType": "DISCOUNTED"},{"sportsCategories": [{"amount": 1117.3,"sportType": "CRICKET_SPORT"},{"amount": 6187.79,"sportType": "FOOTBALL"}],"feeType": "RECURRING"},{"sportsCategories": [{"amount": 1117.3,"sportType": "CRICKET"},{"amount": 6187.79,"sportType": "FOOTBALL"}],"feeType": "NON_RECURRING"}]}}
优化后的Jolt转换规则(结合条件与循环)
Jolt中没有显式的for语法,通过*通配符实现数组/对象的遍历循环,同时搭配值匹配实现条件分支。以下是简化且逻辑清晰的转换规则:
[ { "operation": "shift", "spec": { "*": { "sports": { "percent": { "@": "additionalInfo[0].value", "#percent": "additionalInfo[0].property" }, "feeType": { "*": { "sport_fee_type": { "Discounted fee": { "#DISCOUNTED": "billing.feeSummary[&3].feeType", "@2,discount": ["additionalInfo[1].value", "discountedPrice"], "#discountAmount": "additionalInfo[1].property", "@2,fee_details": { "*": { "total": "billing.feeSummary[&5].sportsCategories[&1].amount", "sports_catagory": "billing.feeSummary[&5].sportsCategories[&1].sportType" } } }, "Recurring fee": { "#RECURRING": "billing.feeSummary[&3].feeType", "@2,fee_details": { "*": { "total": "billing.feeSummary[&5].sportsCategories[&1].amount", "sports_catagory": "billing.feeSummary[&5].sportsCategories[&1].sportType" } } }, "Non Recurring fee": { "#NON_RECURRING": "billing.feeSummary[&3].feeType", "@2,fee_details": { "*": { "total": "billing.feeSummary[&5].sportsCategories[&1].amount", "sports_catagory": "billing.feeSummary[&5].sportsCategories[&1].sportType" } } } } } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "billing": { "feeSummary": { "*": { "sportsCategories": { "*": { "sportType": "=join('_',=split(' ',=toUpper(@(1,sportType))))" } } } } } } } ]
核心逻辑说明
- 循环实现:使用
*遍历feeType和fee_details数组,自动处理每个元素,替代显式循环语法。 - 条件分支:通过匹配
sport_fee_type的具体值,实现不同费用类型的差异化转换逻辑。 - 路径索引引用:用
&数字引用上级路径的数组索引,确保循环中每个元素的输出位置准确对应。 - 简化数据处理:将多个
modify步骤合并为一个,通过嵌套函数一次性完成转大写→拆分→下划线连接的操作。
内容的提问来源于stack exchange,提问作者Prasad S Deshpande
相关产品推荐
相关产品推荐

