首页 > 技术文章 > 返回只包含指定键值对的json

javaupup 2021-04-22 17:43 原文

项目中要用到,从数据库查询到的json中,返回只含指定键值对的json
做法:

  1. 构造一个实体类,类的属性就是要返回的指定键值对中的键
  2. 解析json
  3. 赋值指定键值对给另一个json
  4. 返回
// 测试用
    @RequestMapping(value = "/getreportbrieflist2", method = {RequestMethod.GET,RequestMethod.POST})
    public String getreportbrieflist2(HttpServletRequest request) {

        // 查询构造的实体类的所有实例数据-----列表形式
        List<Reportbrief> reportbrieflist=reportsMapper.getreportbrieflist();

        // 遍历每个实例
        for (Reportbrief report : reportbrieflist) {
            // 拿到数据库中存json的字段
            JSONObject jsonObject = JSONObject.fromObject(report.getRsource());
            // 开始解析嵌套的json
            JSONObject rjson = jsonObject.getJSONObject("rjson");

            JSONObject canvasData = JSONObject.fromObject(rjson.getJSONObject("canvasData"));
            JSONArray objects = canvasData.getJSONArray("objects");

            JSONObject reportjson = JSONObject.fromObject(rjson.getJSONObject("report"));
            JSONArray params = reportjson.getJSONArray("params");

           // 后期要把一个json中的部分属性赋值给另一个json,先构造一个ArrayList再转成json数组
            List jsonArray = new ArrayList(objects.size());
            JSONArray jsonArray1 = JSONArray.fromObject(jsonArray);

            // 向构造的实体类中赋值,第一层json需要的属性
            report.setParams(params);

            // 遍历第一层中的某个数组属性的键
            for (int i = 0; i < objects.size(); i++) {
                // 获取该JSONArray中的每个JSON对象
                JSONObject object = objects.getJSONObject(i);

                // 创建一个新的JSON对象,用来放需要返回的键值对
                JSONObject jsonObject1 = new JSONObject();
                jsonObject1.put("rType", object.get("rType"));
                jsonObject1.put("isDrillDown", object.get("isDrillDown"));

                // 这里的数据只在一开始从数据库中拿数据的时候才需要,如果没有这个属性,那么即使select * 也没法拿到数据,因为从数据库中拿到数据后是壹壹对应,用来构造实体类
                report.setRsource(null);
                report.setIcobase64(null);

                // 根据查询语句数组获取数据数组                
                String querys[]=object.getString("query").split(";");
                JSONArray dataArray=new JSONArray();
                Long datasourceid=object.getLong("dataOrigin");
                Datasource datasource = datasourceMapper.getDatasourceById(datasourceid);
                for(int j=0; j<querys.length; j++){
                    if(querys[j].length()>0){
                        String sqlresult = 查询数据结果;
                       dataArray.add(sqlresult);
                    }
                }

                // object.put("data", dataArray);如果这样放,就是把数据放到了原本的json对象中,后面如果jsonArray1.add(object);最后就返回的还是原来的json,会参杂很多冗余属性

                // 把数据数组放到指定键下面
                jsonObject1.put("data", dataArray);
                // 把新构造的json对象,添加到json数组中
                jsonArray1.add(jsonObject1);
            }
            // 把json数组赋值给实体类
            report.setObjects(jsonArray1);
        }

        // 把实体类实例列表转成json
        return new Gson().toJson(reportbrieflist);
    }

推荐阅读