富客戶端程序設計實例 - Action層 - Json 的序列化

Yangcl 11年前發布 | 5K 次閱讀


        Json 序列化是 RIA 應用程序特有的一步環節。Json是一種輕量級數據交換格式,他的出現替代了XMl文件作為平臺無關的媒介。ExtJS作為視圖層,需要與后臺交換數據。交換的方式為Json串。這一部分是系統后臺與前臺的連接點。

      

查詢記錄

        針對將查詢結果集響應回視圖所返回的Json串,是多條記錄的集合。Json串示例樣式:
</span></div>

{"results":13,"items":[{"id":"1","statu":1,"name":"1","pass":"9","age":9,"sex":"9","money":9,"email":"9","mobile":"9","managerId":9,"inTime":"9","outTime":"9"},……{}],"success":true}

這些內容會被ExtJS中的Model解析成一個個對象,然后顯示在Ext.grid.Panel中顯示對應的記錄。

[java] view plaincopy
</div> </div>

  1. /** 
  2.     * 將json數據寫入此次響應流中 
  3.     * @param str json數據 
  4.     */  
  5.    private void jsonWriter(String str)  
  6.    {  
  7.        Writer writer = null;  
  8.        try  
  9.        {  
  10.            try  
  11.            {  
  12.                writer = ServletActionContext.getResponse().getWriter();  
  13.                writer.write(str);  
  14.                //ServletActionContext 在 package org.apache.struts2; 下。  
  15.                //getWriter() 在 package javax.servlet;下。  
  16.            }  
  17.            finally  
  18.            {  
  19.                writer.flush();   // 清除  
  20.                writer.close();   // 關閉  
  21.            }  
  22.        }  
  23.        catch (IOException e)  
  24.        {  
  25.            e.printStackTrace();  
  26.        }  
  27.    }  
  28.    /** 
  29.     * 將查詢結果集響應回視圖 
  30.     * @param list 結果集 
  31.     * @param <T> 實體對象類型 
  32.  
  33.     * @return  json 
  34.     */  
  35.    protected <T> String ajaxJson(List<T> list)  
  36.    {  
  37.        String strs = "{\"results\":" + list.size() + 
  38.                      ",\"items\":" + gson.toJson(list) + ",\"success\":true}";  
  39.        jsonWriter(strs);  
  40.        return strs;  
  41.    }  
  42. </ol> </div> </div>

    增加記錄與修改記錄

            此時返回的是一條記錄,對應的Json串如下

    {"statu":"2","name":"2","pass":"2","age":2,"sex":"2","money":2,"email":"2","mobile":"2","managerId":2,"inTime":"2","outTime":"2"}

    下一步需要將Json串轉換成對象保存到List中,最后由DAO持久化到數據庫里。getObjectFromJson返回的對象是:org.hongbo.Yangcl.entity.Employee@18e7a09

    [java] view plaincopy
    </div> </div>

    1. /** 
    2.  * 讀取request中的json信息 
    3.  * @return jsonStr 
    4.  */  
    5. protected String getJsonFromRequest()  
    6. {  
    7.     String jsonStr = null;  
    8.     try  
    9.     {  
    10.         BufferedReader br = ServletActionContext.getRequest().getReader();  
    11.         jsonStr = br.readLine() ;  
    12.     }  
    13.     catch (IOException e)  
    14.     {  
    15.         e.printStackTrace();  
    16.     }  
    17.     return jsonStr;  
    18. }  
    19. </ol> </div> </div>

      1. /** 
      2.  * 將json解析成相應實體對象 
      3.  * @param json  json數據 
      4.  * @param cla 實體類 
      5.  * @param <T>   實體對象類型 
      6.  * @return  實體對象 
      7.  */  
      8. protected <T> T getObjectFromJson(String json, Class<T> cla)  
      9. {  
      10.     if (StringUtils.isNotEmpty(json) && cla != null)  
      11.     {  
      12.         return gson.fromJson(json, cla);  
      13.     }  
      14.     return null;  
      15. }  
      16. </ol> </div> </div>

        對應在EmployeeAction.java中

         view plaincopy
        </div> </div>

        1. public class EmployeeAction extends BaseAction  
        2. {  
        3.     // 保存數據  
        4.     public void add()  
        5.     {  
        6.         String jsonStr = getJsonFromRequest();  
        7.         System.out.println("保存數據 Request" + jsonStr);  
        8.         List<Employee> empList = new ArrayList<Employee>();  
        9.         empList.add(getObjectFromJson(jsonStr, Employee.class));  
        10.         service.saveInfo(empList);  
        11.     }  
        12.   
        13.     //更新數據  
        14.     public void update()  
        15.     {  
        16.         String jsonStr = getJsonFromRequest();  
        17.         System.out.println("更新數據 Request" + jsonStr);  
        18.         List<Employee> empList = new ArrayList<Employee>();  
        19.         empList.add(getObjectFromJson(jsonStr, Employee.class));  
        20.         service.updateInfo(empList);  
        21.     }  
        22. }  
        23. </ol> </div> </div>

                 
          </div>

          刪除記錄

                  針對刪除操作,substring(1,json.length()-1)去除字符串中的“【” 和 “】”。新字符串從原串的第二個字符開始,倒數第二個結束 。 在取得的字符串中的兩條記錄中,連接方式是這樣的"outTime":"1"},{"id":"0001"( 兩條記錄間的連接方式:  },{  )目的要將多條記錄分割成數組,將 “,” 替換成 “$” 。故采用正則表達式轉換連接方式為: }${    。 \\ 是正則的特殊字符的表示。

            

          局部測試代碼  

          System.out.println(json.substring(1,json.length()-1).replaceAll(a,b ));     //結果:"outTime":"1"}${"id":"4028800 

          [java] view plaincopy
          </div> </div>

          1.     /** 
          2.      * 將json解析成相應實體對象集合  刪除一條數據會用到 
          3.      * @param json  json數據 
          4.      * @param cla 實體類 
          5.      * @param <T>   實體對象類型 
          6.      * @return  實體對象集合 
          7.      */  
          8.     protected <T> List<T> getListFromJson(String json, Class<T> cla)  
          9.     {  
          10.         if (StringUtils.isNotEmpty(json) && cla != null)  
          11.         {  
          12.             List<T> list = new ArrayList<T>();  
          13.             String[] strs = null;  
          14.   
          15.             if(json.startsWith("[") && json.endsWith("]"))    //刪除多條記錄會進入此分支  
          16.             {   
          17.                 String a = "\\},\\{" ;  
          18.                 String b =  "\\}\\$\\{" ;  
          19.                 strs = json.substring(1,json.length()-1).replaceAll(a,b ).split("\\$");   
          20.             }  
          21.             else if(json.startsWith("{") && json.endsWith("}")) //刪除一條記錄會進入此分支  
          22.             {  
          23.                 strs = json.split("$"); //因為沒有$這個字符,故字符串會被整體分割成一個數組  
          24.             }else  
          25.             {  
          26.                 // TODO 異常信息處理  
          27.             }  
          28.   
          29.             for(String str : strs)  
          30.             {  
          31.                 list.add(gson.fromJson(str, cla));  
          32.             }  
          33.             return list;  
          34.         }  
          35.         return null;  
          36.     }  
          37. </ol> </div> </div>





           本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
           轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
           本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!