关于JSON转换总结
关于JSON转换总结
前言
JSON 是 JavaScript 数据类型中的一个子集,目前主流的浏览器都使用了通用的 JavaScript 引擎组件,所以在解析 JSON 格式时具有良好的兼容性。这便是 “JavaScript Object Notation”(缩写为 JSON )诞生的由来。
一些常用的JSON解析依赖库有阿里的fastjson和国外的jackjson,以下示例基于fastjson。
结构形式
-
认识JSON 数组是[],对象是{}
JSON对象{"id": "229", "power": 79148.74747499419, "power_upper": 91021.0595962433, "power_lower": 67276.43535374505, "date_time": "2024-03-22"}
JSON数组
["h","e","l","l","o"]
JSON对象数组
[{"id": "229", "power": 79148.74747499419, "power_upper": 91021.0595962433, "power_lower": 67276.43535374505, "date_time": "2024-03-22"}, ...]
这里的data也是一个JSON数组,使用JSONObject的getJSONArray(“data”)方法获取到value值json数组
{ "data": { "content": [ { "id": "926160574061371392", "status": "PROGRESSING", "updateContent": "测试一下", "version": "10.6.0", "createTime": "2023-10-31 17:11:28" }, { "id": "926160574061371326", "status": "CANCELED", "updateContent": "测试测试", "version": "123.0", "createTime": "2023-10-31 17:11:28" } ] }, "code": 200, "msg": "成功", "success": true }
JavaBean转JSON
转为JSON格式时,没有值的字段
@Test
public void test01() throws Exception {
PredictingData predictingData = new PredictingData();
predictingData.setId("1");
String jsonObject = JSONObject.toJSONString(predictingData);
System.out.println(jsonObject); // 输出:{"id":"1"}
// 没有值的字段没有转
}
// 转JSON字符串
String jsonStr = JSON.toJSONString(javaBean);
String listJson = JSON.toJSONString(list);
String listJson = JSON.toJSONString(list);
// 转JSON数组
JSONArray jsonArray = (JSONArray)JSONArray.toJSON(list);
JSON转JavaBean
@Test
public void test() throws Exception {
List<WeatherForecastData> list = weatherForecastMapper.getWeatherForecastListByYear("2024");
// JSONArray data = JSONArray.parseArray(JSONObject.toJSONString(list));//结果1
List<WeatherForecastData> data = JSONArray.parseArray(JSONObject.toJSONString(list), WeatherForecastData.class);//结果2
System.out.println(data);
}
数据库查询结果:
结果1:
结果2:
因为有的字段我没有查出来的,比如id没有查,但id有默认值0,所以JSON格式有id字段;比如time字段需要进行处理,没有直接查而是使用中间字段timeMonth转接在业务层做了赋值处理,所以当time为null,不会出现在转换后的JSON格式中
从结果可以看到解析方法的不同,解析成JSONArray时如果JavaBean的某字段没有值,那么就不会出现在转换后的JSON数组字段中;而解析成实体类时会指定对应的JavaBean类类型,没有值的字段会赋字段属性默认值。
这里提一下涉及到JSON传参的注解:
@RequestBody与@RequestParam区别
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
后期开发中,发送json格式数据为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
问题:
远程预测中心对接给我传回预测结果的时候,遇见下列几个问题:
-
传回数据是一个数组集合,内容类型是application/x-www-form-urlencoded不支持,需要application/json
-
最后使用的@RequestBody注解,传的String类型的字符串参数
-
先将字符串解析成JSONObject,再将JSONObject的getJSONArray方法解析成JSONArray对象,最后遍历JSON数组转成实体类集合
@PostMapping("/insertPredictedData") public int insertPredictedData(@RequestBody String predictedDataList) { JSONObject jsonObject = JSONObject.parseObject(predictedDataList, JSONObject.class); JSONArray jsonArray = jsonObject.getJSONArray("predictedDataList"); ArrayList<PredictedData> list = new ArrayList<>(); for (Object o : jsonArray) { PredictedData predictedData = JSON.parseObject(o.toString(), PredictedData.class); list.add(predictedData); } System.out.println("数据条数" + list.size()); int n = predictedDataMapper.insertPredictedDataHavingId(list); return SUCCESS; } // 也可以一步解析成对象集合PredictedData[] students = JSON.parseObject(str2, PredictedData[].class);
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix