解析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"的改成"姓名"中文。

bash 复制代码
{
  "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"
}

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

二、解析json

2.1 知识点补充

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

java 复制代码
//理解知识点:获取jsonObject 同理:获取数组 JSONArray.parseArray()
        JSONObject jsonObject = JSONObject.parseObject(strjson);
        System.out.println(jsonObject.get("message"));//Data retrieved successfully

执行结果如下图:因为是第一层,所以获取倒是"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. 循环数组,解析数组里的每一个对象。
java 复制代码
		//解析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);
                
            }

        }

三、修改key值

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

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

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

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

四、返封装参数

我们在改完之后,需要封装回去。这样才能改变总json串的值。所以我们需从内到外层一步一步封装回去。
注:每一步封装都需要删除原来的,设置成新的(修改后的)

如下图所示:从内-外层进行封装。

五、效果图展示

通过修改前、后的对比可以发现,已经实现了修改key值。如下图所示:

六、全部代码

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

代码如下:

java 复制代码
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();
    }

总结

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

相关推荐
blammmp20 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵38 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong43 分钟前
Java反射
java·开发语言·反射
努力的家伙是不讨厌的1 小时前
解析json导出csv或者直接入库
开发语言·python·json
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器
Re.不晚2 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐2 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。2 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野2 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java