Chinaunix首页 | 论坛 | 博客
  • 博客访问: 900124
  • 博文数量: 322
  • 博客积分: 6688
  • 博客等级: 准将
  • 技术积分: 3626
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-19 11:26
文章分类

全部博文(322)

文章存档

2013年(5)

2012年(66)

2011年(87)

2010年(164)

分类: Java

2011-01-05 19:08:18

Java代码
  1. package info.moogens.mvc.tools.json;  
  2.   
  3. import java.lang.reflect.Array;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Modifier;  
  6. import java.util.Collection;  
  7. import java.util.HashMap;  
  8. import java.util.Iterator;  
  9. import java.util.Map;  
  10.   
  11. /** 
  12.  * JSON操作类 
  13.  * 暂时仅仅支持将java对象转储成JSON格式的字符串 
  14.  *  
  15.  * 原来用的 Simple Json 中的JSONValue.toJSONString 不能渲染POJO对象, 无论是使用 元注释还是实现接口 * 或多或少的都存在移植依赖性的问题. 
  16.  * 而POLO对象会用在多个地方,诸如: 视图/数据库表映射[DAO]/服务层 等等 
  17.  *  
  18.  * 如果对象属于复合对象的话(非基本数据类型)可能存在效率问题,建议不使用多层次的POLO类 
  19.  *  
  20.  * @author KenXu 
  21.  *  
  22.  */  
  23. public final class JsonSpread {  
  24.           
  25.     @SuppressWarnings("unchecked")  
  26.     public static String toJSONString(Object value) {  
  27.         if (value == nullreturn "null";  
  28.   
  29.         if (value instanceof Number) return value.toString();  
  30.         if (value instanceof Boolean) return value.toString();  
  31.           
  32.         if (value instanceof String)  
  33.             return "\"" + escape((String) value) + "\"";  
  34.           
  35.         if (value instanceof Double) {  
  36.             if (((Double) value).isInfinite() || ((Double) value).isNaN())  
  37.                 return "null";  
  38.             else  
  39.                 return value.toString();  
  40.         }  
  41.   
  42.         if (value instanceof Float) {  
  43.             if (((Float) value).isInfinite() || ((Float) value).isNaN())  
  44.                 return "null";  
  45.             else  
  46.                 return value.toString();  
  47.         }  
  48.                           
  49.         if (value instanceof Map) return map2Json((Map) value);  
  50.           
  51.         if (value instanceof Collection) return coll2Json((Collection) value);  
  52.           
  53.         if (value.getClass().isArray()) return array2Json(value);  
  54.           
  55.         return pojo2Json(value);  
  56.     }  
  57.       
  58.     static String array2Json(Object array) {  
  59.         if (null == array) return "null" ;  
  60.         StringBuffer sb = new StringBuffer();  
  61.         sb.append('[');  
  62.           
  63.         // 此处减1是为了下面的 逗号 追加  
  64.         int len = Array.getLength(array) - 1;  
  65.         if (len > -1){  
  66.             int i ;  
  67.             for (i = 0; i < len; i++) {  
  68.                 sb.append(toJSONString(Array.get(array, i))).append(", ");  
  69.             }  
  70.             sb.append(toJSONString(Array.get(array, i)));  
  71.         }  
  72.           
  73.         sb.append(']');  
  74.         return sb.toString();  
  75.     }  
  76.       
  77.     static String coll2Json(Collection coll) {  
  78.         if (null == coll) return "null" ;  
  79.         StringBuffer sb = new StringBuffer();  
  80.         sb.append('[');  
  81.         for (Iterator it = coll.iterator(); it.hasNext();) {  
  82.             sb.append(toJSONString(it.next()));  
  83.             if (it.hasNext())  
  84.                 sb.append(", ");  
  85.         }  
  86.         sb.append(']');  
  87.         return sb.toString();  
  88.     };  
  89.   
  90.     static String pojo2Json(Object obj) {  
  91.         Class type = obj.getClass();  
  92.         Field[] fields = type.getDeclaredFields();  
  93.         Map map = new HashMap();  
  94.         for (Field f : fields) {  
  95.             if (Modifier.isStatic(f.getModifiers()))  
  96.                 continue;  
  97.             String name = f.getName();  
  98.             f.setAccessible(true);  
  99.             Object value = null;  
  100.             try {  
  101.                 value = f.get(obj);  
  102.             } catch (Exception e) {  
  103.                 value = null;  
  104.             }  
  105.             map.put(name, value);  
  106.         }  
  107.         type = null;fields = null;  
  108.         return map2Json(map);  
  109.     }  
  110.       
  111.     @SuppressWarnings("unchecked")  
  112.     static String map2Json(Map map) {  
  113.         if (null == map) return "null" ;  
  114.           
  115.         StringBuffer sb = new StringBuffer();  
  116.         sb.append('{');  
  117.         for (Iterator it = map.entrySet().iterator(); it.hasNext();) {  
  118.             Map.Entry entry=(Map.Entry)it.next();  
  119.               
  120.             String key = (String)entry.getKey();  
  121.             if (null == key) continue ;  
  122.               
  123.             sb.append('\"');  
  124.             escape(key,sb);  
  125.             sb.append('\"').append(':').append(toJSONString(entry.getValue()));  
  126.               
  127.             if (it.hasNext())  
  128.                 sb.append(", ");  
  129.         }  
  130.         sb.append('}');  
  131.         return sb.toString();  
  132.     };  
  133.   
  134.     /** 
  135.      * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). 
  136.      * @param s 
  137.      * @return 
  138.      */  
  139.     public static String escape(String s){  
  140.         if(s==null)  
  141.             return null;  
  142.         StringBuffer sb = new StringBuffer();  
  143.         escape(s, sb);  
  144.         return sb.toString();  
  145.     }     
  146.       
  147.     /** 
  148.      * @param s - Must not be null. 
  149.      * @param sb 
  150.      */  
  151.     static void escape(String s, StringBuffer sb) {  
  152.         for (int i = 0; i < s.length(); i++) {  
  153.             char ch = s.charAt(i);  
  154.             switch (ch) {  
  155.             case '"':  
  156.                 sb.append("\\\"");  
  157.                 break;  
  158.             case '\\':  
  159.                 sb.append("\\\\");  
  160.                 break;  
  161.             case '\b':  
  162.                 sb.append("\\b");  
  163.                 break;  
  164.             case '\f':  
  165.                 sb.append("\\f");  
  166.                 break;  
  167.             case '\n':  
  168.                 sb.append("\\n");  
  169.                 break;  
  170.             case '\r':  
  171.                 sb.append("\\r");  
  172.                 break;  
  173.             case '\t':  
  174.                 sb.append("\\t");  
  175.                 break;  
  176.             case '/':  
  177.                 sb.append("\\/");  
  178.                 break;  
  179.             default:  
  180.                 // Reference:   
  181.                 if ((ch >= '\u0000' && ch <= '\u001F')  
  182.                         || (ch >= '\u007F' && ch <= '\u009F')  
  183.                         || (ch >= '\u2000' && ch <= '\u20FF')) {  
  184.                     String ss = Integer.toHexString(ch);  
  185.                     sb.append("\\u");  
  186.                     for (int k = 0; k < 4 - ss.length(); k++) {  
  187.                         sb.append('0');  
  188.                     }  
  189.                     sb.append(ss.toUpperCase());  
  190.                 } else {  
  191.                     sb.append(ch);  
  192.                 }  
  193.             }  
  194.         }  
  195.     }  
  196.   
  197. }  

 

测试代码:

 

Java代码
  1. package info.moogens.mvc.tools.json;  
  2.   
  3. public final class User {  
  4.     private String name ,id;  
  5.     private Address ress ;  
  6.       
  7.     public User(){  
  8.         this.name = "色色";  
  9.         this.id = "123";  
  10.         this.ress = new Address();  
  11.         this.ress.setCity("北京");  
  12.         this.ress.setZip(10086);  
  13.     }  
  14.       
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public String getId() {  
  22.         return id;  
  23.     }  
  24.     public void setId(String id) {  
  25.         this.id = id;  
  26.     }  
  27.     public Address getRess() {  
  28.         return ress;  
  29.     }  
  30.     public void setRess(Address ress) {  
  31.         this.ress = ress;  
  32.     }  
  33.       
  34. }  
  35.   
  36. class Address {  
  37.     private String city;  
  38.     private int zip ;  
  39.     public String getCity() {  
  40.         return city;  
  41.     }  
  42.     public void setCity(String city) {  
  43.         this.city = city;  
  44.     }  
  45.     public int getZip() {  
  46.         return zip;  
  47.     }  
  48.     public void setZip(int zip) {  
  49.         this.zip = zip;  
  50.     }  
  51.       
  52. }  
 
Java代码
  1. package info.moogens.mvc.tools.json;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import info.moogens.demo.pcmaster.Application;  
  9. import info.moogens.mvc.tools.Toolkit;  
  10. import info.moogens.mvc.web.UDI;  
  11.   
  12. public class X {  
  13.   
  14.     /** 
  15.      * @param args 
  16.      */  
  17.     public static void main(String[] args) {  
  18. //      System.out.println((String)null);  
  19.         System.out.println(Toolkit.toJson(UDI.parseUDIString("/book/show")));  
  20.         System.out.println(Toolkit.toJson(new Application()));  
  21.         System.out.println(Toolkit.toJson(new User()));  
  22.         List list = new ArrayList();  
  23.         list.add("abc我是");  
  24.         list.add(new Integer(123));  
  25.         list.add(new Double(222.123));  
  26.         list.add(new Boolean(true));  
  27.         list.add(null);  
  28.         Map map = new HashMap();  
  29.         map.put("name","fang");  
  30.         map.put("age",new Integer(27));  
  31.         map.put("is_developer",new Boolean(true));  
  32.         map.put("weight",new Double(60.21));  
  33.         map.put("user",new User());  
  34.         map.put("list",list);  
  35.           
  36.         int[] array = new int[5];  
  37.         array[4] = 72 ;   
  38.         array[3] = 21 ;   
  39.         array[1] = 12 ;   
  40.           
  41.         map.put("array",array);  
  42.           
  43.         System.out.println(Toolkit.toJson(map));  
  44.     }  
  45.   
  46. }  

 

 

测试结果:

写道

 
Js代码
  1. {"namespace":"default""action":"show""controller":"Book"}  
  2. {}  
  3. {"ress":{"zip":10086, "city":"北京"}, "name":"色色""id":"123"}  
  4. {"list":["abc我是", 123, 222.123, truenull], "user":{"ress":{"zip":10086, "city":"北京"}, "name":"色色""id":"123"}, "age":27, "is_developer":true"name":"fang""weight":60.21, "array":[0, 12, 0, 21, 72]}  

 

 

阅读(2182) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~