如何通过单个JOLT转换同时展开dimensions和metrics数组并添加标识字段?
单个JOLT转换实现双数组合并与字段添加
需求描述
需要展开JSON中的dimensions和metrics两个数组:为dimensions数组的每个对象添加metadata_object="dimensions"字段,为metrics数组的每个对象添加metadata_object="metrics"字段,最终将两个数组的结果合并为一个数组。
源JSON
{ "dimensions": [ { "apiName": "achievementId", "uiName": "Achievement ID" }, { "apiName": "adFormat", "uiName": "Ad format", "category": "Publisher" } ], "metrics": [ { "apiName": "active1DayUsers", "uiName": "1-day active users" }, { "apiName": "active28DayUsers", "uiName": "28-day active users" } ], "name": "properties/317728157/metadata" }
预期结果
[ { "apiName":"achievementId", "uiName":"Achievement ID", "metadata_object":"dimensions" }, { "apiName":"adFormat", "uiName":"Ad format", "category":"Publisher", "metadata_object":"dimensions" }, { "apiName":"active1DayUsers", "uiName":"1-day active users", "metadata_object":"metrics" }, { "apiName":"active28DayUsers", "uiName":"28-day active users", "metadata_object":"metrics" } ]
现有分步配置
目前已能通过以下分步JOLT配置实现单个数组的转换:
[ { "operation": "shift", "spec": { "dimensions": { "*": { "*": "[&1].&" } } } }, { "operation": "default", "spec": { "*": { "metadata_object": "dimensions" } } } ]
解决方案
可以通过单个shift操作完成所有转换,无需拆分步骤。核心思路是在shift阶段同时处理两个数组,为每个对象注入对应的metadata_object字段,并自动合并到同一个输出数组中。
最终JOLT配置如下:
[ { "operation": "shift", "spec": { "dimensions": { "*": { // 复制当前对象的所有字段 "*": "[#2].&", // 注入metadata_object字段,值为外层键名dimensions "$1": "[#2].metadata_object" } }, "metrics": { "*": { // 复制当前对象的所有字段 "*": "[#2].&", // 注入metadata_object字段,值为外层键名metrics "$1": "[#2].metadata_object" } } } } ]
配置说明
#2是JOLT的层级引用:对于dimensions数组内的元素,#2指向元素在数组中的索引(从0开始);metrics数组的元素会自动接在dimensions元素之后,完成数组合并。"$1"直接引用外层的键名(dimensions或metrics)作为metadata_object的字段值,避免硬编码。- 源JSON中的
name字段会被自动忽略,因为配置中未对其做映射处理。
内容的提问来源于stack exchange,提问作者fujidaon
相关产品推荐
相关产品推荐

