1. 程式人生 > >java如何讀寫json文件

java如何讀寫json文件

ebo contex efault 項目 lean 積分 但是 .get eof

  在實際項目開發中,有時會遇到一些全局的配置緩存,最好的做法是配置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 = "[{"+"\n"
                                        +" \"" +"id"+"\" "+":"+" \""+sai.getId()+"\","+"\n"
                                        +" \"" +"img11"+"\" "+":"+" \""+sai.getImg11()+"\","+"\n"
                                        +" \"" +"img12"+"\" "+":"+" \""+sai.getImg12()+"\","+"\n"
                                        +" \"" +"img13"+"\" "+":"+" \""+sai.getImg13()+"\","+"\n"
                                        +" \"" +"img21"+"\" "+":"+" \""+sai.getImg21()+"\","+"\n"
                                        +" \"" +"img22"+"\" "+":"+" \""+sai.getImg22()+"\","+"\n"
                                        +" \"" +"img23"+"\" "+":"+" \""+sai.getImg23()+"\","+"\n"
                                        +" \"" +"url11"+"\" "+":"+" \""+sai.getUrl11()+"\","+"\n"
                                        +" \"" +"url12"+"\" "+":"+" \""+sai.getUrl12()+"\","+"\n"
                                        +" \"" +"url13"+"\" "+":"+" \""+sai.getUrl13()+"\","+"\n"
                                        +" \"" +"url21"+"\" "+":"+" \""+sai.getUrl21()+"\","+"\n"
                                        +" \"" +"url22"+"\" "+":"+" \""+sai.getUrl22()+"\","+"\n"
                                        +" \"" +"url23"+"\" "+":"+" \""+sai.getUrl23()+"\""+"\n"
                                        +"}]";
        boolean isUpdate = jsonUtil.writeFile(pathRoot+"/config/adver_img.json", config);
        if(isUpdate){
            return "200";
        }else{
            return "505";
        }
    }    
}

至此關於json文件的讀寫就完成了

java如何讀寫json文件