富客户端程序设计实例 - Action层 - Json 的序列化

6年前

        Json 序列化是 RIA 应用程序特有的一步环节。Json是一种轻量级数据交换格式,他的出现替代了XMl文件作为平台无关的媒介。ExtJS作为视图层,需要与后台交换数据。交换的方式为Json串。这一部分是系统后台与前台的连接点。
      
查询记录
        针对将查询结果集响应回视图所返回的Json串,是多条记录的集合。Json串示例样式:
{"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中显示对应的记录。
  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.    }  
增加记录与修改记录
        此时返回的是一条记录,对应的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
  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. }  
  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. }  
对应在EmployeeAction.java中
  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. }  
       
删除记录
        针对删除操作,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 
  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.     }