java bean 转为JSON

来源:互联网 发布:java内部类 编辑:程序博客网 时间:2024/05/17 20:40

这是一个工具类,不依赖于其它第三方的库,用于响应AJAX的请求时,把服务器端的一个对象(一般是POJO类,或是集合),封装成JSON格式,来响应AJAX的请求,也就是把这个对象,原样搬到客户端的浏览器内存中,可以用JS访问。

 

后面有可下载的ZIP包, 内有所有代码,包括测试的类。

 

这是 JsonUtil类部分:

Java代码  收藏代码
  1. package json;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import java.util.Collection;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8. /** 
  9.  * 作者 赵磊 
  10.  *  
  11.  * JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式 除了字符 ",\,/ 
  12.  * 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出 Object 对象在 JSON 中是用 {} 
  13.  * 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>,而不是 
  14.  * Java 的 Class 。注意 Key 只能用 String 表示。 
  15.  *  
  16.  * Prototype提供了 evalJSON() 方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量 
  17.  *  
  18.  *  
  19.  */  
  20. public final class JsonUtil  
  21. {  
  22.   
  23.     /** 
  24.      * 把对象封装为JSON格式 
  25.      *  
  26.      * @param o 
  27.      *            对象 
  28.      * @return JSON格式 
  29.      */  
  30.     @SuppressWarnings("unchecked")  
  31.     public static String toJson(final Object o)  
  32.     {  
  33.         if (o == null)  
  34.         {  
  35.             return "null";  
  36.         }  
  37.         if (o instanceof String) //String  
  38.         {  
  39.             return string2Json((String) o);  
  40.         }  
  41.         if (o instanceof Boolean) //Boolean  
  42.         {  
  43.             return boolean2Json((Boolean) o);  
  44.         }  
  45.         if (o instanceof Number) //Number  
  46.         {  
  47.             return number2Json((Number) o);  
  48.         }  
  49.         if (o instanceof Map) //Map  
  50.         {  
  51.             return map2Json((Map<String, Object>) o);  
  52.         }  
  53.         if (o instanceof Collection) //List  Set  
  54.         {  
  55.             return collection2Json((Collection) o);  
  56.         }  
  57.         if (o instanceof Object[]) //对象数组  
  58.         {  
  59.             return array2Json((Object[]) o);  
  60.         }  
  61.   
  62.         if (o instanceof int[])//基本类型数组  
  63.         {  
  64.             return intArray2Json((int[]) o);  
  65.         }  
  66.         if (o instanceof boolean[])//基本类型数组  
  67.         {  
  68.             return booleanArray2Json((boolean[]) o);  
  69.         }  
  70.         if (o instanceof long[])//基本类型数组  
  71.         {  
  72.             return longArray2Json((long[]) o);  
  73.         }  
  74.         if (o instanceof float[])//基本类型数组  
  75.         {  
  76.             return floatArray2Json((float[]) o);  
  77.         }  
  78.         if (o instanceof double[])//基本类型数组  
  79.         {  
  80.             return doubleArray2Json((double[]) o);  
  81.         }  
  82.         if (o instanceof short[])//基本类型数组  
  83.         {  
  84.             return shortArray2Json((short[]) o);  
  85.         }  
  86.         if (o instanceof byte[])//基本类型数组  
  87.         {  
  88.             return byteArray2Json((byte[]) o);  
  89.         }  
  90.         if (o instanceof Object) //保底收尾对象  
  91.         {  
  92.             return object2Json(o);  
  93.         }  
  94.   
  95.         throw new RuntimeException("不支持的类型: " + o.getClass().getName());  
  96.     }  
  97.   
  98.     /** 
  99.      * 将 String 对象编码为 JSON格式,只需处理好特殊字符 
  100.      *  
  101.      * @param s 
  102.      *            String 对象 
  103.      * @return JSON格式 
  104.      */  
  105.     static String string2Json(final String s)  
  106.     {  
  107.         final StringBuilder sb = new StringBuilder(s.length() + 20);  
  108.         sb.append('\"');  
  109.         for (int i = 0; i < s.length(); i++)  
  110.         {  
  111.             final char c = s.charAt(i);  
  112.             switch (c)  
  113.             {  
  114.             case '\"':  
  115.                 sb.append("\\\"");  
  116.                 break;  
  117.             case '\\':  
  118.                 sb.append("\\\\");  
  119.                 break;  
  120.             case '/':  
  121.                 sb.append("\\/");  
  122.                 break;  
  123.             case '\b':  
  124.                 sb.append("\\b");  
  125.                 break;  
  126.             case '\f':  
  127.                 sb.append("\\f");  
  128.                 break;  
  129.             case '\n':  
  130.                 sb.append("\\n");  
  131.                 break;  
  132.             case '\r':  
  133.                 sb.append("\\r");  
  134.                 break;  
  135.             case '\t':  
  136.                 sb.append("\\t");  
  137.                 break;  
  138.             default:  
  139.                 sb.append(c);  
  140.             }  
  141.         }  
  142.         sb.append('\"');  
  143.         return sb.toString();  
  144.     }  
  145.   
  146.     /** 
  147.      * 将 Number 表示为 JSON格式 
  148.      *  
  149.      * @param number 
  150.      *            Number 
  151.      * @return JSON格式 
  152.      */  
  153.     static String number2Json(final Number number)  
  154.     {  
  155.         return number.toString();  
  156.     }  
  157.   
  158.     /** 
  159.      * 将 Boolean 表示为 JSON格式 
  160.      *  
  161.      * @param bool 
  162.      *            Boolean 
  163.      * @return JSON格式 
  164.      */  
  165.     static String boolean2Json(final Boolean bool)  
  166.     {  
  167.         return bool.toString();  
  168.     }  
  169.   
  170.     /** 
  171.      * 将 Collection 编码为 JSON 格式 (List,Set) 
  172.      *  
  173.      * @param c 
  174.      * @return 
  175.      */  
  176.     static String collection2Json(final Collection<Object> c)  
  177.     {  
  178.         final Object[] arrObj = c.toArray();  
  179.         return toJson(arrObj);  
  180.     }  
  181.   
  182.     /** 
  183.      * 将 Map<String, Object> 编码为 JSON 格式 
  184.      *  
  185.      * @param map 
  186.      * @return 
  187.      */  
  188.     static String map2Json(final Map<String, Object> map)  
  189.     {  
  190.         if (map.isEmpty())  
  191.         {  
  192.             return "{}";  
  193.         }  
  194.         final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方  
  195.         sb.append('{');  
  196.         final Set<String> keys = map.keySet();  
  197.         for (final String key : keys)  
  198.         {  
  199.             final Object value = map.get(key);  
  200.             sb.append('\"');  
  201.             sb.append(key); //不能包含特殊字符  
  202.             sb.append('\"');  
  203.             sb.append(':');  
  204.             sb.append(toJson(value)); //循环引用的对象会引发无限递归  
  205.             sb.append(',');  
  206.         }  
  207.         // 将最后的 ',' 变为 '}':   
  208.         sb.setCharAt(sb.length() - 1'}');  
  209.         return sb.toString();  
  210.     }  
  211.   
  212.     /** 
  213.      * 将数组编码为 JSON 格式 
  214.      *  
  215.      * @param array 
  216.      *            数组 
  217.      * @return JSON 格式 
  218.      */  
  219.     static String array2Json(final Object[] array)  
  220.     {  
  221.         if (array.length == 0)  
  222.         {  
  223.             return "[]";  
  224.         }  
  225.         final StringBuilder sb = new StringBuilder(array.length << 4); //4次方  
  226.         sb.append('[');  
  227.         for (final Object o : array)  
  228.         {  
  229.             sb.append(toJson(o));  
  230.             sb.append(',');  
  231.         }  
  232.         // 将最后添加的 ',' 变为 ']':   
  233.         sb.setCharAt(sb.length() - 1']');  
  234.         return sb.toString();  
  235.     }  
  236.   
  237.     static String intArray2Json(final int[] array)  
  238.     {  
  239.         if (array.length == 0)  
  240.         {  
  241.             return "[]";  
  242.         }  
  243.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  244.         sb.append('[');  
  245.         for (final int o : array)  
  246.         {  
  247.             sb.append(Integer.toString(o));  
  248.             sb.append(',');  
  249.         }  
  250.         // set last ',' to ']':  
  251.         sb.setCharAt(sb.length() - 1']');  
  252.         return sb.toString();  
  253.     }  
  254.   
  255.     static String longArray2Json(final long[] array)  
  256.     {  
  257.         if (array.length == 0)  
  258.         {  
  259.             return "[]";  
  260.         }  
  261.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  262.         sb.append('[');  
  263.         for (final long o : array)  
  264.         {  
  265.             sb.append(Long.toString(o));  
  266.             sb.append(',');  
  267.         }  
  268.         // set last ',' to ']':  
  269.         sb.setCharAt(sb.length() - 1']');  
  270.         return sb.toString();  
  271.     }  
  272.   
  273.     static String booleanArray2Json(final boolean[] array)  
  274.     {  
  275.         if (array.length == 0)  
  276.         {  
  277.             return "[]";  
  278.         }  
  279.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  280.         sb.append('[');  
  281.         for (final boolean o : array)  
  282.         {  
  283.             sb.append(Boolean.toString(o));  
  284.             sb.append(',');  
  285.         }  
  286.         // set last ',' to ']':  
  287.         sb.setCharAt(sb.length() - 1']');  
  288.         return sb.toString();  
  289.     }  
  290.   
  291.     static String floatArray2Json(final float[] array)  
  292.     {  
  293.         if (array.length == 0)  
  294.         {  
  295.             return "[]";  
  296.         }  
  297.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  298.         sb.append('[');  
  299.         for (final float o : array)  
  300.         {  
  301.             sb.append(Float.toString(o));  
  302.             sb.append(',');  
  303.         }  
  304.         // set last ',' to ']':  
  305.         sb.setCharAt(sb.length() - 1']');  
  306.         return sb.toString();  
  307.     }  
  308.   
  309.     static String doubleArray2Json(final double[] array)  
  310.     {  
  311.         if (array.length == 0)  
  312.         {  
  313.             return "[]";  
  314.         }  
  315.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  316.         sb.append('[');  
  317.         for (final double o : array)  
  318.         {  
  319.             sb.append(Double.toString(o));  
  320.             sb.append(',');  
  321.         }  
  322.         // set last ',' to ']':  
  323.         sb.setCharAt(sb.length() - 1']');  
  324.         return sb.toString();  
  325.     }  
  326.   
  327.     static String shortArray2Json(final short[] array)  
  328.     {  
  329.         if (array.length == 0)  
  330.         {  
  331.             return "[]";  
  332.         }  
  333.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  334.         sb.append('[');  
  335.         for (final short o : array)  
  336.         {  
  337.             sb.append(Short.toString(o));  
  338.             sb.append(',');  
  339.         }  
  340.         // set last ',' to ']':  
  341.         sb.setCharAt(sb.length() - 1']');  
  342.         return sb.toString();  
  343.     }  
  344.   
  345.     static String byteArray2Json(final byte[] array)  
  346.     {  
  347.         if (array.length == 0)  
  348.         {  
  349.             return "[]";  
  350.         }  
  351.         final StringBuilder sb = new StringBuilder(array.length << 4);  
  352.         sb.append('[');  
  353.         for (final byte o : array)  
  354.         {  
  355.             sb.append(Byte.toString(o));  
  356.             sb.append(',');  
  357.         }  
  358.         // set last ',' to ']':  
  359.         sb.setCharAt(sb.length() - 1']');  
  360.         return sb.toString();  
  361.     }  
  362.   
  363.     public static String object2Json(final Object bean)  
  364.     {  
  365.         //数据检查  
  366.         if (bean == null)  
  367.         {  
  368.             return "{}";  
  369.         }  
  370.         final Method[] methods = bean.getClass().getMethods(); //方法数组  
  371.         final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方  
  372.         sb.append('{');  
  373.   
  374.         for (final Method method : methods)  
  375.         {  
  376.             try  
  377.             {  
  378.                 final String name = method.getName();  
  379.                 String key = "";  
  380.                 if (name.startsWith("get"))  
  381.                 {  
  382.                     key = name.substring(3);  
  383.   
  384.                     //防死循环  
  385.                     final String[] arrs =  
  386.                     { "Class" };  
  387.                     boolean bl = false;  
  388.                     for (final String s : arrs)  
  389.                     {  
  390.                         if (s.equals(key))  
  391.                         {  
  392.                             bl = true;  
  393.                             continue;  
  394.                         }  
  395.                     }  
  396.                     if (bl)  
  397.                     {  
  398.                         continue//防死循环  
  399.                     }  
  400.                 }  
  401.                 else if (name.startsWith("is"))  
  402.                 {  
  403.                     key = name.substring(2);  
  404.                 }  
  405.                 if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)  
  406.                 {  
  407.                     if (key.length() == 1)  
  408.                     {  
  409.                         key = key.toLowerCase();  
  410.                     }  
  411.                     else if (!Character.isUpperCase(key.charAt(1)))  
  412.                     {  
  413.                         key = key.substring(01).toLowerCase() + key.substring(1);  
  414.                     }  
  415.                     final Object elementObj = method.invoke(bean);  
  416.   
  417.                     //System.out.println("###" + key + ":" + elementObj.toString());  
  418.   
  419.                     sb.append('\"');  
  420.                     sb.append(key); //不能包含特殊字符  
  421.                     sb.append('\"');  
  422.                     sb.append(':');  
  423.                     sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归  
  424.                     sb.append(',');  
  425.                 }  
  426.             }  
  427.             catch (final Exception e)  
  428.             {  
  429.                 //e.getMessage();  
  430.                 throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);  
  431.             }  
  432.         }  
  433.         if (sb.length() == 1)  
  434.         {  
  435.             return bean.toString();  
  436.         }  
  437.         else  
  438.         {  
  439.             sb.setCharAt(sb.length() - 1'}');  
  440.             return sb.toString();  
  441.         }  
  442.     }  
  443.   
  444.     private JsonUtil()  
  445.     {  
  446.     }  

0 0
原创粉丝点击