引言:
fastjson目前我了解好像是没有支持将 json
转为 csv
的,网上大多是用org.json
的 CDL.toString
来将json
数组转化为csv
的,但是在我这出现两个问题:
1. 表头指定的顺序会变:
我的json
数组:
[{"name":"LiMing","age":"28","gender":"man"},{"name":"LiPing","age":"26","gender":"women"}]
我用CDL.toString
结果得到的是:
gender,name,age
women,LiPing,26
man,LiMing,28
但我们其实想要,名字在前面:
name,age,gender
LiMing,28,man
LiPing,26,women
这是因为,CDL.toString
是根据 传入的json数组中的JSONObject来处理的,而org.json
的JSONObject
又是按a-z
顺序来排序,那么问题就变成了,如何让org.json
的 JSONObject
有序,可以看到他的构造方法中,默认是HashMap
, 将其改为LinkedHashMap
即可保持有序,
public JSONObject() {
this.map = new LinkedHashMap();
}
但是改源码很不方便,并且还要自己打包使用,不知道为什么org.json
自己不出一个orderJSONObject
呢。
2. 项目中都是用的fastjson,用两个容易混乱
即使按上一步所说的修改了源码,也会在同一个项目中用到两个json包,特别不利于维护以及引用时容易搞错。并且fastjson
支持传入参数指定一个有序的JSONObject
,这一点比org.json
好多了,但是fastjson
不支持转化为csv
,所以要写一个将com.alibaba.fastjson.JSONArray
转化为csv
的方法,主要就是参考org.json
的 CDL.java
了。
解决:
以下是代码:
使用示例:
JSONArray array = new JSONArray();
JSONObject object2 = new JSONObject(new LinkedHashMap<>()); // 传入LinkedHashMap指定有序
object2.put("name","LiMing");
object2.put("age","28");
object2.put("gender","man");
JSONObject object = new JSONObject(new LinkedHashMap<>()