怎样用 esProc 变换 json 串里的多层集合

有一个 2 层的 json 串,下层是多个动态的 key-value,不含集合 / 数组类型。

{"Games": {"key1": "value1", "key2": value2,"key3":value3}}

现在要把下层变换成多层的集合。

{"Games":{"AllGames":[{"key1":["value1"]},{"key2":["value2"]},{"key3":["value3"]}]}}

SQL 本身不支持多层数据,更难表达多层集合,间接实现的代码很复杂。SPL 天然支持多层数据和多层集合:https://try.esproc.com/splx?4JF


 A

1

{"Games": {"key1": "value1", "key2": value2,"key3":value3}}

2

=E@p([A1.Games])

3

=new(new(A2.(eval("new([~2]:"/ ~1 /")")):AllGames):Games)

4

=json(A3)

A1:将多层 json 串自动解析为 SPL 序表类型。点击展开后,可以看到上层是单字段的一条记录,下层是多字段的一条记录。

Picture1png
A2:取下层数据(一条记录),将类型改为记录的集合,再转置为二层序列。[…] 表示集合,函数 E 可以将记录集合转换为二维序列,@p 表示转换时进行转置。

Picture2png
A3 部分代码:A2.(eval(“new([~2]:”/ ~1 /“)”)) 把 A2 中的序列变成多层集合。函数 eval 可以把字符串当做代码执行,函数 new(字段值: 字段名) 可以生成一条记录,~ 表示序列的当前成员,~1 表示第 1 个子成员。计算结果如下图:

Picture3png
new(new(…:AllGames):Games) 在多层集合上面加两层记录类型,构造出目标序表。
Picture4png
A4:最后用 json 函数将序表转换为目标 json 串。