项目中有如下一个JSONObject, 如何取出“20180612”
项目中用的alibaba的fastjson
项目中取的方法如下所示
然后我就试图自己构造这个dataSet,构造完之后就开始取date
下图中倒数第二行可以取出来,但是照着上面的方法写,也就是倒数第一行所示
JSONArray arr0 = result.getJSONArray(0);
这行代码会意外中断
好一会我都意识不到最后一行代码的写法为啥项目中能取到,我的就取不到
然后我就通过断点看了一下json结构,红框框处的地方显示出两者的不同
项目中value下面还有一级,而我构造的这个就没有
项目中的value相当于JSONArray套JSONArray
而我构造的value相当于value就是一层JSONArray
然后我就意识到项目中result的value取值其实是一个二维数组
第一维是按date划分的,第二维是相当于一个bean中各个字段的取值,
第二维其实里用bean挺好的,外层一个JSONArray,内层是一个一个bean,多好啊,为啥项目中内层非要用一个JSONArray,用数组甚至没法表示每个元素的含义,用JSONObject也比这个强
// JSONArray中能添加不同类型的元素,但是不是键值对的形式,也是通过下标取数的
// JSONObject完全能取代map,也可以用来构造javabean,这就是项目中为啥到处都是JSON
// JSONArray和普通的数组用法相似,通过下标索引,甚至可以存放不同类型的元素,也可以嵌套使用
然后我就开始重新构造这个dataSet
下面附上完整代码
public class testJson {
public static void main(String[] args) {
JSONObject dataSet = new JSONObject();
JSONArray value_out = new JSONArray(); // value的外层JSONArray
JSONArray inner_12 = new JSONArray(); // 内层12
inner_12.add("20180612");
inner_12.add("54505");
inner_12.add("2");
JSONArray inner_13 = new JSONArray(); // 内层13
inner_13.add("20180613");
inner_13.add("54505");
inner_13.add("2");
JSONArray inner_14 = new JSONArray(); // 内层14
inner_14.add("20180614");
inner_14.add("54505");
inner_14.add("2");
// 往外层JSONArray中套JSONArray
value_out.add(inner_12);
value_out.add(inner_13);
value_out.add(inner_14);
dataSet.put("result", value_out); // put(key1, value1)
dataSet.put("sum", value_out); // put(key2,value2)
JSONArray result = dataSet.getJSONArray("result"); // 获取到的是二维数组,JSONArray套JSONArray
JSONArray sum = dataSet.getJSONArray("sum");
String date0 = result.getJSONArray(0).getString(0); // 获取第一个元素的date
System.out.println(date0);
if (!CollectionUtils.isEmpty(result)) {
for (int i = 0; i < result.size(); i++) {
JSONArray record = result.getJSONArray(i); // 获取内层json数组
String date = record.getString(0);
System.out.println(date);
}
}
}
}