如何用JOLT过滤JSON中CpmBannerCampaign.Settings数组指定对象?
问题描述
现有如下JSON数据:
{ "Id": 1124574, "Name": "3Test_pro_RTB (dec)20 06", "StartDate": "2024-12-09", "CreateTime": "2024-06-20T18:23:11Z", "Type": "CPM_BANNER_CAMPAIGN", "Status": "DRAFT", "State": "OFF", "SourceId": null, "Funds": { "Mode": "SHARED_ACCOUNT_FUNDS", "SharedAccountFunds": { "Refund": 0, "Spend": 0 } }, "RepresentedBy": { "Manager": null, "Agency": "Havas Digital" }, "CpmBannerCampaign": { "BiddingStrategy": { "Search": { "BiddingStrategyType": "SERVING_OFF" }, "Network": { "BiddingStrategyType": "CP_MAXIMUM_IMPRESSIONS", "CpMaximumImpressions": { "StartDate": "2024-12-09", "EndDate": "2024-12-15", "AutoContinue": "NO", "AverageCpm": 101000000, "SpendLimit": 3000000000 } } }, "Settings": [ { "Option": "ADD_METRICA_TAG", "Value": "YES" }, { "Option": "ADD_OPENSTAT_TAG", "Value": "NO" }, { "Option": "ADD_TO_FAVORITES", "Value": "NO" }, { "Option": "DAILY_BUDGET_ALLOWED", "Value": "YES" }, { "Option": "ENABLE_AREA_OF_INTEREST_TARGETING", "Value": "NO" }, { "Option": "ENABLE_SITE_MONITORING", "Value": "NO" }, { "Option": "REQUIRE_SERVICING", "Value": "NO" }, { "Option": "SHARED_ACCOUNT_ENABLED", "Value": "YES" } ], "VideoTarget": "CLICKS", "CounterIds": null, "FrequencyCap": { "Impressions": 3, "PeriodDays": 30 } } }
需要保留JSON的全部内容,仅对CpmBannerCampaign.Settings数组进行过滤:仅保留数组中Option属性值为ADD_OPENSTAT_TAG, ADD_METRICA_TAG, ADD_TO_FAVORITES, ENABLE_AREA_OF_INTEREST_TARGETING, ENABLE_CURRENT_AREA_TARGETING, ENABLE_REGULAR_AREA_TARGETING, ENABLE_SITE_MONITORING, REQUIRE_SERVICING的对象,移除不符合条件的对象。
过滤后的Settings数组示例如下:
"Settings": [ { "Option": "ADD_METRICA_TAG", "Value": "YES" }, { "Option": "ADD_OPENSTAT_TAG", "Value": "NO" }, { "Option": "ADD_TO_FAVORITES", "Value": "NO" }, { "Option": "ENABLE_AREA_OF_INTEREST_TARGETING", "Value": "NO" }, { "Option": "ENABLE_SITE_MONITORING", "Value": "NO" }, { "Option": "REQUIRE_SERVICING", "Value": "NO" } ]
请问能否通过JOLT实现该过滤需求?
答案
可以通过JOLT实现这个过滤需求。下面是对应的JOLT规范:
[ { "operation": "shift", "spec": { "*": "&", // 保留所有顶层字段 "CpmBannerCampaign": { "*": "&1.&", // 保留CpmBannerCampaign下除Settings外的所有字段 "Settings": { "*": { "Option": { // 匹配允许的Option值,符合条件的保留整个对象 "ADD_OPENSTAT_TAG|ADD_METRICA_TAG|ADD_TO_FAVORITES|ENABLE_AREA_OF_INTEREST_TARGETING|ENABLE_CURRENT_AREA_TARGETING|ENABLE_REGULAR_AREA_TARGETING|ENABLE_SITE_MONITORING|REQUIRE_SERVICING": { "@2": "&3.&2" // 将符合条件的对象放入CpmBannerCampaign.Settings数组中 } } } } } } } ]
说明
- 使用
shift操作重新构造JSON结构,保留所有不需要修改的字段; - 针对
CpmBannerCampaign.Settings数组,通过匹配Option字段的允许值,仅保留符合条件的对象; @2表示向上回溯两层获取当前的数组元素(即整个{Option:..., Value:...}对象),&3.&2表示将该对象放到CpmBannerCampaign.Settings对应的位置。
处理后的完整JSON结果
{ "Id": 1124574, "Name": "3Test_pro_RTB (dec)20 06", "StartDate": "2024-12-09", "CreateTime": "2024-06-20T18:23:11Z", "Type": "CPM_BANNER_CAMPAIGN", "Status": "DRAFT", "State": "OFF", "SourceId": null, "Funds": { "Mode": "SHARED_ACCOUNT_FUNDS", "SharedAccountFunds": { "Refund": 0, "Spend": 0 } }, "RepresentedBy": { "Manager": null, "Agency": "Havas Digital" }, "CpmBannerCampaign": { "BiddingStrategy": { "Search": { "BiddingStrategyType": "SERVING_OFF" }, "Network": { "BiddingStrategyType": "CP_MAXIMUM_IMPRESSIONS", "CpMaximumImpressions": { "StartDate": "2024-12-09", "EndDate": "2024-12-15", "AutoContinue": "NO", "AverageCpm": 101000000, "SpendLimit": 3000000000 } } }, "Settings": [ { "Option": "ADD_METRICA_TAG", "Value": "YES" }, { "Option": "ADD_OPENSTAT_TAG", "Value": "NO" }, { "Option": "ADD_TO_FAVORITES", "Value": "NO" }, { "Option": "ENABLE_AREA_OF_INTEREST_TARGETING", "Value": "NO" }, { "Option": "ENABLE_SITE_MONITORING", "Value": "NO" }, { "Option": "REQUIRE_SERVICING", "Value": "NO" } ], "VideoTarget": "CLICKS", "CounterIds": null, "FrequencyCap": { "Impressions": 3, "PeriodDays": 30 } } }
内容的提问来源于stack exchange,提问作者Mark Avreliy
相关产品推荐
相关产品推荐

