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

    科技2024-03-16  65

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

    有目录,不迷路

    前言缘由转换蹊径

    前言

    愉快的(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); } } }

    运行程序,可得: 同样成功!!!

    Processed: 0.019, SQL: 8