系列文章目录
Java中运用BigDecimal对字符串的数值进行加减乘除等操作
List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
VUE整合Echarts实现简单的数据可视化
SpringBoot+Vue3实现登录验证码功能
更多该系列文章请查看我的主页哦
文章目录
- 系列文章目录
- 前言
- 一、数据准备
- 二、解析json
-
- [2.1 知识点补充](#2.1 知识点补充)
- [2.2 逐层解析json](#2.2 逐层解析json)
- 三、修改key值
- 四、返封装参数
- 五、效果图展示
- 六、全部代码
- 总结
前言
根据实际开发需求,需解析JSON格式的参数。修改key的值变换成中文,如"name":"张三",就需要修改成"姓名":"张三"。解决此需求,需分为以下三个步骤:
- 解析json参数,解析到要修改的层
- 修改key值
- 返封装参数。
下面我们就根据上述的步骤完成一个案例。相信这个案例掌握后,对于类似的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步:
- 解析data对象,所以使用JSON.parseObject
- 解析数组,所以用JSONArray.parseArray
- 循环数组,解析数组里的每一个对象。
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。
这里我们使用"移除"和"增加"方法来实现修改
下述代码分为三步骤,分别为:
- 保存原来的value值。
- 移除原来的键值对。
- 新增一个键值对,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串也是可以轻松解决的。