编写嵌套数组的Jolt转换规范,修复AudienceRangePrecision映射错误
问题
我有一个含嵌套数组的JSON,需要转换为指定格式但未成功。输入JSON的audiencerange数组中,每个元素包含AudienceRangePrecision数组(元素为"03"和"04");转换规则为03映射为"From",04映射为"To"。期望输出是onix_audience_range下的values数组,每个元素的AudienceRangePrecision值为"From,To",但当前使用的Jolt Shift操作规范得到的结果是两个元素分别为"From,From"和"To,To"。
输入JSON:
{"audiencerange": [{"AudienceRangePrecision": ["03","04"]},{"AudienceRangePrecision": ["03","04"]}]}
期望输出:
{"onix_audience_range": {"values": [{"AudienceRangePrecision": "From,To"},{"AudienceRangePrecision": "From,To"}]}}
当前错误输出:
{"onix_audience_range": {"values": [{"AudienceRangePrecision": "From,From"},{"AudienceRangePrecision": "To,To"}]}}
使用的部分Jolt规范:
{"operation": "shift","spec": {"AudienceRangePrecision": {"*": {"1|01": {"#Exact": "onix_audience_range.values[&2].AudienceRangePrecision"},"3|03": {"#From": "onix_audience_range.values[&2].AudienceRangePrecision"},"4|04": {"#To": "onix_audience_range.values[&2].AudienceRangePrecision"}}}}}
解决方案
原规范的问题在于索引引用错误:&2指向的是AudienceRangePrecision数组的内部索引(0和1),导致"03"和"04"被分别映射到values数组的不同元素中,而非同一元素内拼接。
需要分两步实现正确转换:先将同一audiencerange元素下的映射值归集到同一位置,再拼接成字符串。完整Jolt规范如下:
[ // 第一步:将每个audiencerange元素的映射值归集到对应values元素的临时数组 { "operation": "shift", "spec": { "audiencerange": { "*": { "AudienceRangePrecision": { "03": {"#From": "onix_audience_range.values[&3].AudienceRangePrecision[]"}, "04": {"#To": "onix_audience_range.values[&3].AudienceRangePrecision[]"} } } } } }, // 第二步:将临时数组拼接为逗号分隔的字符串 { "operation": "modify-overwrite-beta", "spec": { "onix_audience_range": { "values": { "*": { "AudienceRangePrecision": "=join(',',@(1,AudienceRangePrecision))" } } } } } ]
关键说明:
- Shift阶段:用
&3引用audiencerange数组的索引,确保同一个audiencerange元素下的"03"和"04"映射到values数组的对应元素中,形成["From", "To"]临时数组。 - Modify阶段:通过
join函数将临时数组拼接为"From,To"字符串,覆盖原数组值。
内容的提问来源于stack exchange,提问作者aashna
相关产品推荐
相关产品推荐

