How to convert csv To nested Json in java
问题
https://stackoverflow.com/questions/58859344/how-to-convert-csv-to-nested-json-in-java
i have a csv file in following format
A_aa,A_ab,A_ac,A_ad,B_BB_ba,B_BB_BBB_bb
1,2,3,4,5,6
and i want to convert it into following Nested json
{
'A':{
'aa' : '1',
'ab' : '2',
'ac' : '4',
'ad' : '5',
}
'B':{
'BB':{
'ba' : '5',
'BBB':{
'bb' : '6'
}
}
}
}
解答
csv文件中的第一行是字段名(用下划线表示了层次关系),第 2 行是数据,需要把csv 转成 json 格式。难点在于动态解析,需要用到分组、递归、循环、条件判断与字符串拼接。用 Java 实现代码较长。
用Java 下的开源包 SPL 很容易写,只要 5 行:
A |
B |
|
1 |
=file("json.csv").import@cw() |
|
2 |
=i=0,A1(1).(~.split("_")).(~|A1(2)(#)).(~.run(~="\""/~/"\"")) |
|
3 |
func recurse(AA) |
>B1=left(B1,-i)/"{}"/right(B1,i),i+=1,AA.group(~(1)).(if(~.len()==1 && ~(1).len()==2,B1=left(B1,-i)/~(1).concat(":")/right(B1,i),(B1=left(B1,-i)/~(1)(1)/":"/right(B1,i),func(recurse,~.(~.m(2:)))))) |
4 |
=func(recurse,A2) |
|
5 |
=replace(replace(B1,"\"\"","\",\""),"}\"","},\"") |
SPL 提供了 JDBC 供 Java 调用,把上面的脚本存为 recurse.splx,在 Java 中以存储过程的方式调用脚本文件:
…
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
st = con.prepareCall("call recurse()");
st.execute();
…
English version