如何用Jsonata将首行字段映射到后续行生成目标JSON结构?
用Jsonata实现CSV转结构化JSON的字段映射
问题背景
处理CSV转换后的JSON数据,首行存储字段名(Value字段),需要将后续每行的Value值对应到首行的字段名,生成键值对结构的JSON数组。
输入JSON
[ [ { "LineNbr" : 1, "Value" : "Desc1" }, { "LineNbr" : 1, "Value" : "Desc2" } ], [ { "LineNbr" : 2, "Value" : "Value1" }, { "LineNbr" : 2, "Value" : "Value2" } ], [ { "LineNbr" : 3, "Value" : "Value3" }, { "LineNbr" : 3, "Value" : "Value4" } ], [ { "LineNbr" : 4, "Value" : "Value5" }, { "LineNbr" : 4, "Value" : "Value6" } ], [ { "LineNbr" : 5, "Value" : "Value7" }, { "LineNbr" : 5, "Value" : "Value8" } ] ]
期望输出
[ { "Desc1" : "Value1", "Desc2" : "Value2" }, { "Desc1" : "Value3", "Desc2" : "Value4" }, { "Desc1" : "Value5", "Desc2" : "Value6" }, { "Desc1" : "Value7", "Desc2" : "Value8" } ]
尝试的代码
( $data := $map($, function($v, $i, $a) { { "rowdata": $map([1..$count($v)], function($vs, $is) {$[0][$is].Value}) } }); )
该代码能获取到映射值,但结构不符合预期。
解决方案
使用以下Jsonata表达式可以直接生成目标结构:
( $headers := $[0].Value; $map($[1 to $count($)-1], function($row) { $zip($headers, $row.Value) ~> $merge }) )
代码解释
- 提取表头:
$headers := $[0].Value获取首行所有Value值作为字段名数组,即["Desc1", "Desc2"]。 - 遍历数据行:
$map($[1 to $count($)-1], ...)从第二行开始遍历所有数据行。 - 生成键值对对象:
$zip($headers, $row.Value)将表头数组和当前行的Value数组配对,生成类似[["Desc1", "Value1"], ["Desc2", "Value2"]]的二维数组。~> $merge将二维数组转换为键值对对象。
内容的提问来源于stack exchange,提问作者Stormer
相关产品推荐
相关产品推荐

