JSON解析:JSON对象还能这样???

自信平生无愧事,死后方敢对青天。

有目录,不迷路

前言

愉快的(3+7=8的)中秋国庆假期已经接近尾声,特此写篇博客聊以记录学习过程尽早进入学习状态,也便不陷入假期综合征,使得工作免于痛苦。

缘由

关于如何使用Fastjson进行JSON解析可以查看我的这篇博客:史上最全的JSON解析之Fastjson

之前在工作过程中遇到的如下所示格式的JSON对象需要进行遍历处理:

{
	"王者荣耀" : {
		"韩信" : "001",
		"猪八戒" : "002",
		"伽罗" : "003"
	},
	"西游记" : {
		"孙悟空" : "001",
		"唐僧" : "002",
		"沙悟净" : "003"
	}
}

对于对JSON解析仍处于狭小认知的我来说,遇到JSON解析遍历第一时间便不假思索的果断转换成JSON数组,然后进行遍历呀!于是刷刷刷,开始编码,模拟如下:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * @ClassName Test
 * @Description json字符串处理
 * @Author 古阙月
 * @Date 2020/10/7 11:04
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        String jsonString = "{\n" +
                "\t\"王者荣耀\" : {\n" +
                "\t\t\"韩信\" : \"001\",\n" +
                "\t\t\"猪八戒\" : \"002\",\n" +
                "\t\t\"伽罗\" : \"003\"\n" +
                "\t},\n" +
                "\t\"西游记\" : {\n" +
                "\t\t\"孙悟空\" : \"001\",\n" +
                "\t\t\"唐僧\" : \"002\",\n" +
                "\t\t\"沙悟净\" : \"003\"\n" +
                "\t}\n" +
                "}";
        // 根据JSON字符串得到JSON数组
        JSONArray jsonArray = JSON.parseArray(jsonString);
        // 遍历JSON数组
        for (int i = 0; i < jsonArray.size(); i++) {
            // 根据JSON数组的索引获得JSON对象
            JSONObject jsonObject = (JSONObject) jsonArray.get(i);
            // 输出JSON对象
            System.out.println(jsonObject);
        }
    }
}

结果一输出,傻眼了:
在这里插入图片描述
但其实想想也对,毕竟JSON数组是这种格式:

[{"key1":"value1", "key2":"value2"...}, {"key1":"value1", "key2":"value3"...}...]

而需要处理的数据格式很明显是纯粹的key - value,也就是这种格式:

{"key1" : {"key1":"value1", "key2":"value2"...}, "key2" : {"key1":"value1", "key2":"value3"...}...}

转换

其实我们将需要解析的数据格式转换成Java的数据类型就很好理解了:

JSON数组 -> List<Object>:

[{"key1":"value1", "key2":"value2"...}, {"key1":"value1", "key2":"value3"...}...]

JSON数组对应着Java里面的List集合,所以也就不难理解JSON数组能够直接遍历获取数据了。

而我们上文中需要解析的数据格式:

{"key1" : {"key1":"value1", "key2":"value2"...}, "key2" : {"key1":"value1", "key2":"value3"...}...}

对应着Java中的Map<String, Map<String, String>>类型,或者说是Map<String, Map<String, Object>>类型。

好家伙,那我们直接把JSON字符串转换成相应的对象就好了

/**
 * @ClassName JSONObjectTest
 * @Description json字符串处理
 * @Author 古阙月
 * @Date 2020/9/21 14:01
 * @Version 1.0
 */
public class JSONObjectTest {
    public static void main(String[] args) {
        String jsonString = "{\n" +
                "\t\"王者荣耀\" : {\n" +
                "\t\t\"韩信\" : \"001\",\n" +
                "\t\t\"猪八戒\" : \"002\",\n" +
                "\t\t\"伽罗\" : \"003\"\n" +
                "\t},\n" +
                "\t\"西游记\" : {\n" +
                "\t\t\"孙悟空\" : \"001\",\n" +
                "\t\t\"唐僧\" : \"002\",\n" +
                "\t\t\"沙悟净\" : \"003\"\n" +
                "\t}\n" +
                "}";
        // 将整个json对象转换成一个大map
        HashMap<String, Map<String, Object>> bigMap = JSON.parseObject(jsonString, HashMap.class);
        // 遍历大map
        for (Object key : bigMap.keySet()) {
            // 输出大map的key
            System.out.println(key);

            // 通过大map的key,得到一个个小map
            Map<String, Object> smallMap = (Map<String, Object>) bigMap.get(key);
            System.out.println(smallMap);
        }
    }
}

运行程序,遍历成功:
在这里插入图片描述

蹊径

但既然JSON数组无需转换成List集合再进行遍历。那么,同理我也不需要转换成Map对象即可遍历:

/**
 * @ClassName JSONObjectTest
 * @Description json字符串处理
 * @Author 古阙月
 * @Date 2020/9/21 14:01
 * @Version 1.0
 */
public class JSONObjectTest2 {
    public static void main(String[] args) {
        String jsonString = "{\n" +
                "\t\"王者荣耀\" : {\n" +
                "\t\t\"韩信\" : \"001\",\n" +
                "\t\t\"猪八戒\" : \"002\",\n" +
                "\t\t\"伽罗\" : \"003\"\n" +
                "\t},\n" +
                "\t\"西游记\" : {\n" +
                "\t\t\"孙悟空\" : \"001\",\n" +
                "\t\t\"唐僧\" : \"002\",\n" +
                "\t\t\"沙悟净\" : \"003\"\n" +
                "\t}\n" +
                "}";

        // 将整个json字符串转换成一个JSON对象
        JSONObject bigJSON = JSON.parseObject(jsonString);
        // 遍历JSON对象
        for (Object key : bigJSON.keySet()) {
            // 输出JSON对象的key
            System.out.println(key);

            // 通过JSON对象的key,得到一个个小json
            JSONObject smallJsonObject = (JSONObject) bigJSON.get(key);
            System.out.println(smallJsonObject);
        }
    }
}

运行程序,可得:
在这里插入图片描述
同样成功!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值