zoukankan      html  css  js  c++  java
  • java如何读写json文件

      在实际项目开发中,有时会遇到一些全局的配置缓存,最好的做法是配置redis数据库作为数据缓存,而当未有配置redis服务器时,读取静态资源文件(如xml、json等)也是一种实现方式,但是这有一个弊端,因为作为静态资源存储在站内势必就导致信息的安全性很低,所以如果采用这种方式则建议记录一些安全要求很低的配置属性,当然最好的做法就是使用redis缓存技术。下面就json文件的读写进行进一步说明。

      1、json通用文件读取方法,这个方法会返回map对象:

    /**
         * json读取
         * 
         * @param request
         * @param path
         * @return
         */
        public static List<Map> JsonRead(HttpServletRequest request, String path) {
            List<Map> maps = null;
            String dir = request.getSession().getServletContext().getRealPath(path);
            System.out.println(path);
            System.out.println(dir);
            if (dir == null) {
                System.out.println("找不到数据");
                return null;
            }
            try {
                File file = new File(dir);
                if (!file.exists()) {
                    file.createNewFile();
                }
                String str = FileUtils.readFileToString(file, "UTF-8");
                maps = (List) JSONArray.fromObject(str);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return maps;
        };

     2、json指定文件读取方法,这个方法是针对特定的json文件,返回值也是特定的实体对象:

        首先要先定义实体类(我这里就拿项目中一个demo做示例):  

    package com.net.entity;
    /**
     * 系统广告图片
     * @author zhangdi
     *
     */
    public class SysAdverImg {
    
        private int id;//方便后期数据库拓展
        private String img11;//首页广告1
        private String img12;//首页广告2
        private String img13;//首页广告3
        private String img21;//积分广告1
        private String img22;//积分广告2
        private String img23;//积分广告3
        private String url11;//首页广告链接1
        private String url12;//首页广告链接2
        private String url13;//首页广告链接3
        private String url21;//积分广告链接1
        private String url22;//积分广告链接2
        private String url23;//积分广告链接3
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getImg11() {
            return img11;
        }
        public void setImg11(String img11) {
            this.img11 = img11;
        }
        public String getImg12() {
            return img12;
        }
        public void setImg12(String img12) {
            this.img12 = img12;
        }
        public String getImg13() {
            return img13;
        }
        public void setImg13(String img13) {
            this.img13 = img13;
        }
        public String getImg21() {
            return img21;
        }
        public void setImg21(String img21) {
            this.img21 = img21;
        }
        public String getImg22() {
            return img22;
        }
        public void setImg22(String img22) {
            this.img22 = img22;
        }
        public String getImg23() {
            return img23;
        }
        public void setImg23(String img23) {
            this.img23 = img23;
        }
        
    }

    第二步:针对这个特定实体类来写特定的json文件读取方法:

    /*
         * 取出广告图片内容,填充对象
         */
        public SysAdverImg findSysAdverImg(String path) {
            SysAdverImg config = new SysAdverImg();
            String sets = ReadFile(path);// 获得json文件的内容
            System.out.println(sets);
            // 去掉json中的[]
            sets = sets.substring(1, sets.length() - 1);
            System.out.println(sets);
            JSONObject jo = JSONObject.fromObject(sets);// 格式化成json对象
            System.out.println(jo.toString());
            config.setId(Integer.valueOf(jo.getString("id")));
            config.setImg11(jo.getString("img11"));
            config.setImg12(jo.getString("img12"));
            config.setImg13(jo.getString("img13"));
            config.setImg21(jo.getString("img21"));
            config.setImg22(jo.getString("img22"));
            config.setImg23(jo.getString("img23"));
            config.setUrl11(jo.getString("url11"));
            config.setUrl12(jo.getString("url12"));
            config.setUrl13(jo.getString("url13"));
            config.setUrl21(jo.getString("url21"));
            config.setUrl22(jo.getString("url22"));
            config.setUrl23(jo.getString("url23"));
            return config;
        }

    这里调用的ReadFile方法如下:

    // 读文件,返回字符串
        public String ReadFile(String path) {
            File file = new File(path);
            BufferedReader reader = null;
            String laststr = "";
            try {
                // System.out.println("以行为单位读取文件内容,一次读一整行:");
                reader = new BufferedReader(new FileReader(file));
                String tempString = null;
                int line = 1;
                // 一次读入一行,直到读入null为文件结束
                while ((tempString = reader.readLine()) != null) {
                    // 显示行号
                    System.out.println("line " + line + ": " + tempString);
                    laststr = laststr + tempString;
                    line++;
                }
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e1) {
                    }
                }
            }
            return laststr;
        }

     3、特定的json文件修改(即对json文件进行写的操作)

        首先是编写文件写的通用操作方法:

    // 把json格式的字符串写到文件
        public boolean writeFile(String filePath, String sets) {
            FileWriter fw;
            try {
                fw = new FileWriter(filePath);
                PrintWriter out = new PrintWriter(fw);
                out.write(sets);
                out.println();
                fw.close();
                out.close();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
    
        }

    再就特定的实体类执行写的操作(这里还是以第二步的实体类为例):

    /**
         * 系统后台更新广告图片
         * @param img
         * @param type
         * @param request
         * @param resq
         * @return     200 更新成功 
         *                         501 上传图片为空 
         *                         502 上传类型为空 
         *                         503 无法读取json文件 
         *                         504 错误的类型 
         *                         505 json文件更新失败
         *                         506 上传链接为空
         */
        @RequestMapping(value="updateAdverImgConfig" ,method=RequestMethod.POST,
                produces="application/json;charset=utf-8")
        @ResponseBody
    public String updateAdverImgConfig(
                @RequestParam("img")String img,
                @RequestParam("url")String url,
                @RequestParam("type")Integer type,
                HttpServletRequest request,
                HttpServletResponse resq){
            if(img==null||img==""){
                return "501";//图片为空
            }
            if(type==null){
                return "502";//类型为空
            }
            if(url==null||url==""){
                return "506";//链接为空
            }
            //系统路径
            String pathRoot = request.getSession().getServletContext().getRealPath("");
            //网站配置路径
            String baseRoot = jsonUtil.findSysConfig(pathRoot+"/config/config.json").getBaseUrl();
            //读取出源文件
            SysAdverImg sai = new SysAdverImg();
            try {
                sai = jsonUtil.findSysAdverImg(pathRoot+"/config/adver_img.json");
            } catch (Exception e) {
                return "503";//无法读取源文件
            }
            //处理传过来的base64
            // 这里处理传过来的广告图片base64
            if(img!=""||img!=null){
                 //图片的存储路径
                String newImaPath = File.separator +"img"+File.separator+"imgZip" + File.separator;
                String path = newImaPath+UtilNet.getRandomNumberString(24)+".jpg";
                //截取字符串,将data:image/jpg;base64去掉,取剩余的字符串
                String imgType = img.substring(11, 14);
                if(imgType.equals("jpe")){
                    img = img.substring(23);
                }else if(imgType.equals("jpg")||imgType.equals("png")){
                    img = img.substring(22);
                }else if(imgType.equals("gif")){
                    //data:image/gif;base64,R0l
                    img = img.substring(22);
                }else{
                    img = img.substring(22);
                }
                //进行解码
                ImageBase64Util.GenerateImage(img, path,request);
                //赋值成绝对路径
                System.out.println(path);
                path = baseRoot+path;
                System.out.println(path);
                // 路径赋值
                switch (type) {
                case 0://首页广告1
                    sai.setImg11(path);
                    sai.setUrl11(url);
                    break;
                case 1://首页广告2
                    sai.setImg12(path);
                    sai.setUrl12(url);
                    break;
                case 2://首页广告3
                    sai.setImg13(path);
                    sai.setUrl13(url);
                    break;
                case 3://积分广告1
                    sai.setImg21(path);
                    sai.setUrl21(url);
                    break;
                case 4://积分广告2
                    sai.setImg22(path);
                    sai.setUrl22(url);
                    break;
                case 5://积分广告3
                    sai.setImg23(path);
                    sai.setUrl23(url);
                    break;
                default:
                    return "504";
                }
            }
            //写入json文件中        
            String config = "[{"+"
    "
                                            +" "" +"id"+"" "+":"+" ""+sai.getId()+"","+"
    "
                                            +" "" +"img11"+"" "+":"+" ""+sai.getImg11()+"","+"
    "
                                            +" "" +"img12"+"" "+":"+" ""+sai.getImg12()+"","+"
    "
                                            +" "" +"img13"+"" "+":"+" ""+sai.getImg13()+"","+"
    "
                                            +" "" +"img21"+"" "+":"+" ""+sai.getImg21()+"","+"
    "
                                            +" "" +"img22"+"" "+":"+" ""+sai.getImg22()+"","+"
    "
                                            +" "" +"img23"+"" "+":"+" ""+sai.getImg23()+"","+"
    "
                                            +" "" +"url11"+"" "+":"+" ""+sai.getUrl11()+"","+"
    "
                                            +" "" +"url12"+"" "+":"+" ""+sai.getUrl12()+"","+"
    "
                                            +" "" +"url13"+"" "+":"+" ""+sai.getUrl13()+"","+"
    "
                                            +" "" +"url21"+"" "+":"+" ""+sai.getUrl21()+"","+"
    "
                                            +" "" +"url22"+"" "+":"+" ""+sai.getUrl22()+"","+"
    "
                                            +" "" +"url23"+"" "+":"+" ""+sai.getUrl23()+"""+"
    "
                                            +"}]";
            boolean isUpdate = jsonUtil.writeFile(pathRoot+"/config/adver_img.json", config);
            if(isUpdate){
                return "200";
            }else{
                return "505";
            }
        }    
    }
  • 相关阅读:
    追求一个人怎么这么难
    基于PHPstream扩展手动实现一个redis客户端
    常见final修饰类
    位运算
    HTTP Status 404
    Hibernate Junit 运行报错:org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment
    根据银行卡号码获取银行卡归属行以及logo图标
    进程间通信IPC(InterProcess Communication)
    脏读、幻读、不可重复读和可重复读
    数据库锁知识总结
  • 原文地址:https://www.cnblogs.com/wuxu/p/12844166.html
Copyright © 2011-2022 走看看