关于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);
-