将 json 转存为包含带层次的名称和值两列的 csv 文件
例题描述和简单分析
有 json 文件 json.json,如下:
{
"strings": {
"1level1": {
"1level2": {
"1label1": "1value1",
"1label2": "1value2"
}
},
"2level1": {
"2level2": {
"2level3": {
"2label1": "2value1"
},
"2label2": "2value2"
}
}
}
}
需要转为包含带层次名称和值两列的 csv 文件,其中各层级解析为点号分隔的 key 列,值解析为 value 列,如下:
Keys,Default
1level1.1level2.1label1,1value1
1level1.1level2.1label2,1value2
2level1.2level2.2level3.2label1,2value1
2level1.2level2.2label2,2value2
解法及简要说明
在集算器中编写脚本 p1.dfx,如下所示:
A |
B |
C |
|
1 |
=file("json.json").read().import@j().strings |
||
2 |
=create(Keys,Default) |
||
3 |
>func(A4,A1,null) |
||
4 |
func |
||
5 |
if ifr(A4) |
>A4.fno().(func(A4,A4.field(~),if(B4,B4/".")/A4.fname(~))) |
|
6 |
else |
>A2.insert(0,B4,A4) |
|
7 |
=file("json.csv").export@tc(A2) |
简要说明:
A1 json文件读成多层序表,取 strings 的值
A2 创建空序表 (Keys,Default),Keys 列表示层次名称,Default 列表示值
A3 调用子程序 A4,两个参数分别是 A1 和 null
A4 定义子程序
B5 若 A5 子程序的第一个参数是记录,则执行 C5 格
C5 遍历子程序的第一个参数的每列,调用子程序 A4,参数分别为当前字段值和累积的字段名(用点号分隔)
B6 若 A5 子程序的第一个参数不是记录,则执行 C6 格
C6 将累积的字段名(用点号分隔)和当前值追加至 A2 序表
A7 结果 A2 导出至 json.csv
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
https://stackoverflow.com/questions/63452677/convert-json-to-different-looking-csv-in-java
英文版