关于JSON转换总结

前言

JSON 是 JavaScript 数据类型中的一个子集,目前主流的浏览器都使用了通用的 JavaScript 引擎组件,所以在解析 JSON 格式时具有良好的兼容性。这便是 “JavaScript Object Notation”(缩写为 JSON )诞生的由来。

一些常用的JSON解析依赖库有阿里的fastjson和国外的jackjson,以下示例基于fastjson。

结构形式

  1. 认识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接收请求参数

问题:

远程预测中心对接给我传回预测结果的时候,遇见下列几个问题:

  1. 传回数据是一个数组集合,内容类型是application/x-www-form-urlencoded不支持,需要application/json

  2. 最后使用的@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);
      
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。