Java中的JSON序列化和反序列化(转http://barbara3299.iteye.com/blog/1160858)

Coordinator
May 28, 2012 at 3:15 AM

每次写代码遇到问题的时候,google后总是先找javaeye里给出的答案,比较权威,比较专业,而且通常问题可以很快的解决。这两天在写一个.net客户端和java服务器端通过json报文,使用Mina框架通信的项目,为了减少编写代码的重复性,写了几个使用反射来通过函数名称调用该函数,以及Json序列化和反序列化的程序,现在想总结记录一下。
1. Java中的JSON序列化和反序列化例子:

Java代码 复制代码 收藏代码
  1.      /**  
  2.  * 由字符串反序列化成实体类  针对的是一个实体,此实体中的属性不包括自定义的类型,如Teacher类型,或者List<Teacher>类型   
  3.  * @param source 传入json中的字符串  
  4.  * @param beanClass 实体类的类型  
  5.  * @return 实体类  
  6.  */  
  7. public static Object getObjFromJsonArrStr(String source,Class beanClass)   
  8. {   
  9.     JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON(source);   
  10.     return  JSONObject.toBean(jsonObject,beanClass);           
  11. }   
  12. /**  
  13.  * 由字符串反序列化成实体类  针对的是一个实体,此实体中的属性包括自定义的类型,如Teacher类型,或者List<Teacher>类型  
  14.  * @param jsonArrStr  
  15.  * @param clazz  
  16.  * @param classMap  
  17.  * @return  
  18.  */  
  19. public static Object getObjFromJsonArrStr(String jsonArrStr, Class clazz, Map classMap)    
  20. {     
  21.     JSONObject jsonObj = JSONObject.fromObject(jsonArrStr);     
  22.                return JSONObject.toBean(jsonObj, clazz, classMap);               
  23. }   
  24.   
  25.   
  26. /**  
  27.  * 将string转换成listBean  
  28.  * @param jsonArrStr 需要反序列化的字符串  
  29.  * @param clazz 被反序列化之后的类  
  30.  * @return 实体list  
  31.  */  
  32. @SuppressWarnings("unchecked")   
  33. public static List getListFromJsonArrStr(String jsonArrStr, Class clazz) {     
  34.        JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);     
  35.        List list = new ArrayList();     
  36.        for (int i = 0; i < jsonArr.size(); i++)    
  37.        {     
  38.            list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz));     
  39.        }     
  40.        return list;     
  41.    }    
  42.   
  43. /**  
  44.  * 将string转换成listBean 属性中包含实体类等 如List<Student> 而Student中含有属性List<Teacher>  
  45.  * @param jsonArrStr 需要反序列化的字符串  
  46.  * @param clazz 反序列化后的类  
  47.  * @param classMap 将属性中包含的如Teacher加入到一个Map中,格式如map.put("teacher",Teacher.class)  
  48.  * @return 反序列化后的字符串  
  49.  * 使用示例:  
  50.     Map classMap = new HashMap();  
  51.     //必须要对Parent进行初始化 否则不识别  
  52.     Teacher p = new Teacher();  
  53.     classMap.put("teacher", p.getClass());  
  54.     List mlist = JSONTransfer.getListFromJsonArrStr(resultStr, Student.class, classMap);  
  55.  */  
  56. @SuppressWarnings("unchecked")   
  57. public static List getListFromJsonArrStr(String jsonArrStr, Class clazz, Map classMap)    
  58. {     
  59.       JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);     
  60.       List list = new ArrayList();     
  61.       for (int i = 0; i < jsonArr.size(); i++)    
  62.       {               
  63.           list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz, classMap));     
  64.       }     
  65.       return list;     
  66. }   
  67.        
  68. /**  
  69.  * 序列化操作,无论是单个的对象,还是list,抑或是list中的属性仍包含list,都可以直接序列化成String类型  
  70.  * @param obj 需要被序列化的对象  
  71.  * @return 序列化之后的字符串  
  72.  */  
  73. @SuppressWarnings("unchecked")   
  74. public static String getJsonArrStrFromList(Object obj)    
  75. {    
  76.     //返回結果   
  77.     String jsonStr = null;     
  78.     //判空   
  79.        if (obj == null) {     
  80.            return "{}";     
  81.        }     
  82.        //Json配置         
  83.        JsonConfig jsonCfg = new JsonConfig();     
  84.     
  85.        //注册日期处理器     
  86.        jsonCfg.registerJsonValueProcessor(java.util.Date.class,     
  87.                new JsonDateValueProcessor(SystemConstants.DateFormat));     
  88.           
  89.        //判断是否是list   
  90.        if (obj instanceof Collection || obj instanceof Object[]) {     
  91.            jsonStr = JSONArray.fromObject(obj, jsonCfg).toString();     
  92.        } else {     
  93.            jsonStr = JSONObject.fromObject(obj, jsonCfg).toString();     
  94.        }         
  95.        return jsonStr;    
  96.    }