• 解析JSON格式参数 & 修改对象的key


    系列文章目录

    Java中运用BigDecimal对字符串的数值进行加减乘除等操作
    List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
    VUE整合Echarts实现简单的数据可视化
    SpringBoot+Vue3实现登录验证码功能

    更多该系列文章请查看我的主页哦



    前言

    根据实际开发需求,需解析JSON格式的参数。修改key的值变换成中文,如“name“:“张三”,就需要修改成“姓名“:“张三”。解决此需求,需分为以下三个步骤:

    1. 解析json参数,解析到要修改的层
    2. 修改key值
    3. 返封装参数。

    下面我们就根据上述的步骤完成一个案例。相信这个案例掌握后,对于类似的JSON解析以及修改值对你来说就很简单啦!


    一、数据准备

    这里我们准备一个JSON串,我这里就按照下面的JSON格式的串来进行案例。
    案例要求:修改json串中users对象的key为“name“的改成“姓名”中文。

    {
      "status": "success",
      "data": {
        "users": [
          {
            "id": 1,
            "name": "John Doe",
            "age": 30,
            "email": "johndoe@example.com"
          },
          {
            "id": 2,
            "name": "Jane Smith",
            "age": 25,
            "email": "janesmith@example.com"
          }
        ],
        "products": [
          {
            "id": 1001,
            "name": "Product A",
            "price": 19.99
          },
          {
            "id": 1002,
            "name": "Product B",
            "price": 29.99
          }
        ]
      },
      "message": "Data retrieved successfully"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    这个JSON串虽然结构简单,但设计到的知识点都能够包含进去,对大家来说也比较容易理解。

    二、解析json

    2.1 知识点补充

    解析json,JSONObject.parseObject用来解析json串,解析成对象。同理:获取数组 JSONArray.parseArray(),对象获取值就是get(“key”)。数组获取值(数组里套的是对象)就是getJSONObject(i),获取数组第i个的对象。
    可以用map封装,也可以直接转为JSONObject。json数组同理

    //理解知识点:获取jsonObject 同理:获取数组 JSONArray.parseArray()
            JSONObject jsonObject = JSONObject.parseObject(strjson);
            System.out.println(jsonObject.get("message"));//Data retrieved successfully
    
    • 1
    • 2
    • 3

    执行结果如下图:因为是第一层,所以获取倒是"message"值为Data retrieved successfully。
    在这里插入图片描述

    2.2 逐层解析json

    根据2.1的知识点补充,想必大家对于json的解析已经是有了一个简单的认识。下面我来逐层解析案例中的json串。结合着案例json串的结构看代码比较好理解哦!
    注意:大家在自己解析时,根据自己的json串结构进行解析。
    解释代码:因为我们要改的users这层在data对象下,找到users数组。所以我们需要3步:

    1. 解析data对象,所以使用JSON.parseObject
    2. 解析数组,所以用JSONArray.parseArray
    3. 循环数组,解析数组里的每一个对象。
    		//解析json
            JSONObject jsonMap = JSON.parseObject(jsonObject);
            String strData = String.valueOf(jsonMap.get("data"));
            //解析result下的json
            JSONObject jsonDataMap = JSON.parseObject(strData);
            JSONArray usersArray = JSONArray.parseArray(jsonDataMap.getString("users"));
            int size = usersArray.size();
            //为空则不需要处理
            if(usersArray != null){
                //开始解析
                for(int i=0;i<size;i++){
                    //拿到每一个需要改的对象 将name的key 改成中文“姓名”
                    JSONObject userMap = usersArray.getJSONObject(i);
                    
                }
    
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    三、修改key值

    获取到每个对象后,我们开始修改每个对象的key。

    这里我们使用“移除“和“增加“方法来实现修改

    下述代码分为三步骤,分别为:

    1. 保存原来的value值。
    2. 移除原来的键值对。
    3. 新增一个键值对,key为“姓名”中文,value是保存的原有值。
    		Object name = userMap.get("name");
           //先移除 再添加 移除前记得先获取value
            userMap.remove("name");
            userMap.put("姓名",name);
    
    • 1
    • 2
    • 3
    • 4

    四、返封装参数

    我们在改完之后,需要封装回去。这样才能改变总json串的值。所以我们需从内到外层一步一步封装回去。
    注:每一步封装都需要删除原来的,设置成新的(修改后的)
    如下图所示:从内-外层进行封装。
    在这里插入图片描述

    五、效果图展示

    通过修改前、后的对比可以发现,已经实现了修改key值。如下图所示:
    在这里插入图片描述

    六、全部代码

    我将该例子的解析代码写到了方法里,将案例的json串传到方法中即可进行解析。
    代码如下:

    public static String parseJson(String jsonObject) {
            //解析json
            JSONObject jsonMap = JSON.parseObject(jsonObject);
            String strData = String.valueOf(jsonMap.get("data"));
            //解析result下的json
            JSONObject jsonDataMap = JSON.parseObject(strData);
    //        System.out.println(jsonDataMap);
            JSONArray usersArray = JSONArray.parseArray(jsonDataMap.getString("users"));
            int size = usersArray.size();
            //为空则不需要处理
            if(usersArray != null){
                //开始解析
                for(int i=0;i<size;i++){
                    //拿到每一个需要改的对象 将name的key 改成中文“姓名”
                    JSONObject userMap = usersArray.getJSONObject(i);
                    Object name = userMap.get("name");
                    //先移除 再添加 移除前记得先获取value
                    userMap.remove("name");
                    userMap.put("姓名",name);
    
                    //设置回去
                    usersArray.set(i,userMap);
                }
    
            }
            //将userArray设置回去
            jsonDataMap.remove("users");
            jsonDataMap.put("users",usersArray);
    
            //设置给最外层
            jsonMap.put("data",jsonDataMap);
            return jsonMap.toJSONString();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    总结

    到此案例的实现就算完成了,当然在实际项目需求中解析的内容也要相对而言复杂些(层数多些)。但原理就是通过一层一层解析后进行修改,然后一层一层的封装回去。所以只要大家学会了这个内容,理解每一行代码的含义,相信在以后遇到更加复杂的json串也是可以轻松解决的。

  • 相关阅读:
    夜天之书 #67 为什么开源协议不授予商标权利?
    CMakeLists.txt简单项目模板
    LeetCode 566. Reshape the Matrix
    【后端版】分布式医疗云平台【字典缓存处理(his-system、system-web、system-api、system-service),操作日志管理 】(二十三)
    反射知识点学习
    策略模式适用场景与具体实例解析
    【开源】基于Vue.js的车险自助理赔系统的设计和实现
    Oracle(11)Managing Tables
    从1000篇热门笔记,看小红书的种草趋势
    elasticsearch的DSL查询文档
  • 原文地址:https://blog.csdn.net/weixin_52258054/article/details/133860774