项目中解析JSONObject遇到的一个问题-value是JSONArray嵌套JSONArrray

在项目中遇到一个JSONObject,其value是JSONArray嵌套的JSONArray,导致按照常规方式无法正确取出值。通过断点调试发现,原本的JSONObject的value是一个二维数组,而自己构造的数据只有一层JSONArray。解决方法是理解JSONArray可以作为键值对的value,并根据实际结构进行数据构造和解析。最后,代码示例展示了如何正确处理这种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中有如下一个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);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值