请求提供JOLT转换规则:JSON字段值转字段名(去重问题)
问题:JOLT转换重复键值时避免生成数组,保持独立对象结构
需要将指定JSON负载转换为以字段值作为字段名的JSON,当前使用的JOLT规则在字段值不同时有效,但字段值相同时会生成数组,求合适的JOLT规则。
输入JSON负载
{ "action": { "allowPartialSuccess": true, "records": [ { "ZuoraSubscriptionExtId": "962041ad-e673-492a-a071-5e0ab74ea001", "CPQSubscriptionID__c": "5640029343" }, { "ZuoraSubscriptionExtId": "962041ad-e673-492a-a071-5e0ab74ea001", "CPQSubscriptionID__c": "5640029343" } ], "type": "update" } }
期望输出JSON负载(已修正语法错误)
{ "action" : { "allowPartialSuccess" : true, "records" : [ { "962041ad-e673-492a-a071-5e0ab74ea001" : { "CPQSubscriptionID__c" : "5640029343" } }, { "962041ad-e673-492a-a071-5e0ab74ea001" : { "CPQSubscriptionID__c" : "5640029343" } } ], "type" : "update" } }
注:原期望输出的JSON存在语法错误(
records字段后直接并列多个对象未用数组包裹),已修正为合法格式,确保JSON语法合规。
当前使用的JOLT规则
[ { "operation": "shift", "spec": { "action": { "allowPartialSuccess": "action.allowPartialSuccess", "records": { "*": { "CPQSubscriptionID__c": "action.records.@(1,ZuoraSubscriptionExtId).CPQSubscriptionID__c" } }, "type": "action.type" } } } ]
解决方案
原规则的问题在于:当多条记录的ZuoraSubscriptionExtId值重复时,会将对应内容合并到同一个键下形成数组,破坏了原始记录的独立结构。要保留每条记录的独立对象,需利用数组索引来维持每条记录的独立性:
正确的JOLT规则
[ { "operation": "shift", "spec": { "action": { "allowPartialSuccess": "action.allowPartialSuccess", "records": { "*": { "@": "action.records[&1].@(ZuoraSubscriptionExtId)" } }, "type": "action.type" } } }, { "operation": "remove", "spec": { "action": { "records": { "*": { "*": { "ZuoraSubscriptionExtId": "" } } } } } } ]
规则解释
- Shift操作:通过数组索引
[&1]将每条原始记录映射到records数组的对应位置,同时把ZuoraSubscriptionExtId的值作为该位置对象的外层键,包裹当前记录的全部内容。 - Remove操作:移除每个对象中多余的
ZuoraSubscriptionExtId字段,只保留需要的CPQSubscriptionID__c字段。
效果验证
应用上述规则后,输出的JSON会完整保留原始两条记录的独立对象结构,即使键值重复,也不会合并为数组,与修正后的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Nitinamg
相关产品推荐
相关产品推荐

