将 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