如何用JSONata或JSONPath合并JSON中独立的列与行数组?
使用JSONata合并JSON中的列与行数据
问题描述
我想使用JSONata或JSONPath,把同一个JSON文件里Columns数组的列数据和Rows数组的行数据合并起来,应该要嵌套遍历每行和每列,请问这俩工具能实现吗?
输入JSON
{ "Columns": [ { "ColumnName": "Name", "ColumnType": "string" }, { "ColumnName": "Id", "ColumnType": "int" } ], "Rows": [ ["Alice", 1], ["Bob", 2], ["Carl", 3] ] }
期望输出
{ "combinedData": [ { "Name": "Alice", "Id": 1 }, { "Name": "Bob", "Id": 2 }, { "Name": "Carl", "Id": 3 } ] }
解决方案
工具选择说明
JSONPath仅能完成JSON数据的查询与提取,无法生成新的结构化JSON对象;而JSONata是专为JSON数据转换设计的工具,完全可以实现这类合并需求。
JSONata实现表达式
{ "combinedData": Rows.( $cols := Columns; $reduce($cols, function($acc, $col, $index) { $acc & { $col.ColumnName: $[$index] } }, {}) ) }
表达式解析
- 遍历
Rows数组中的每一行元素 - 用
$cols变量缓存Columns数组,减少重复查询开销 - 通过
$reduce方法遍历Columns,以列的ColumnName为键,对应行的索引值为值,逐步构建键值对对象 - 最终将所有行构建的对象汇总到
combinedData数组中
内容的提问来源于stack exchange,提问作者Daniel Fynes-Clinton
相关产品推荐
相关产品推荐

