Android Json 的福音

来源:互联网 发布:php购物车 编辑:程序博客网 时间:2024/04/30 13:58
android自带的JSON比较弱,而net.sf.json那个在android中会不兼容,于是lz开始了寻觅觅中,终于找到一个牛子自己写的解析json和封装json的工具,万谢啊,现在共享出来。
(声明:这不是什么第三方包,这就是一个工具类,tojson()和string2Json()两个方法就可以满足一些基本的需求啦)
  1. import java.lang.reflect.Method;
  2. import java.util.Collection;
  3. import java.util.Map;
  4. import java.util.Set;

  5. public final class JsonUtil
  6. {

  7.         /**
  8.          * 把对象封装为JSON格式
  9.          * 
  10.          * @param o
  11.          *            对象
  12.          * @return JSON格式
  13.          */
  14.         @SuppressWarnings("unchecked")
  15.         public static String toJson(final Object o)
  16.         {
  17.                 if (o == null)
  18.                 {
  19.                         return "null";
  20.                 }
  21.                 if (o instanceof String) //String
  22.                 {
  23.                         return string2Json((String) o);
  24.                 }
  25.                 if (o instanceof Boolean) //Boolean
  26.                 {
  27.                         return boolean2Json((Boolean) o);
  28.                 }
  29.                 if (o instanceof Number) //Number
  30.                 {
  31.                         return number2Json((Number) o);
  32.                 }
  33.                 if (o instanceof Map) //Map
  34.                 {
  35.                         return map2Json((Map<String, Object>) o);
  36.                 }
  37.                 if (o instanceof Collection) //List  Set
  38.                 {
  39.                         return collection2Json((Collection) o);
  40.                 }
  41.                 if (o instanceof Object[]) //对象数组
  42.                 {
  43.                         return array2Json((Object[]) o);
  44.                 }

  45.                 if (o instanceof int[])//基本类型数组
  46.                 {
  47.                         return intArray2Json((int[]) o);
  48.                 }
  49.                 if (o instanceof boolean[])//基本类型数组
  50.                 {
  51.                         return booleanArray2Json((boolean[]) o);
  52.                 }
  53.                 if (o instanceof long[])//基本类型数组
  54.                 {
  55.                         return longArray2Json((long[]) o);
  56.                 }
  57.                 if (o instanceof float[])//基本类型数组
  58.                 {
  59.                         return floatArray2Json((float[]) o);
  60.                 }
  61.                 if (o instanceof double[])//基本类型数组
  62.                 {
  63.                         return doubleArray2Json((double[]) o);
  64.                 }
  65.                 if (o instanceof short[])//基本类型数组
  66.                 {
  67.                         return shortArray2Json((short[]) o);
  68.                 }
  69.                 if (o instanceof byte[])//基本类型数组
  70.                 {
  71.                         return byteArray2Json((byte[]) o);
  72.                 }
  73.                 if (o instanceof Object) //保底收尾对象
  74.                 {
  75.                         return object2Json(o);
  76.                 }

  77.                 throw new RuntimeException("不支持的类型: " + o.getClass().getName());
  78.         }

  79.         /**
  80.          * 将 String 对象编码为 JSON格式,只需处理好特殊字符
  81.          * 
  82.          * @param s
  83.          *            String 对象
  84.          * @return JSON格式
  85.          */
  86.         static String string2Json(final String s)
  87.         {
  88.                 final StringBuilder sb = new StringBuilder(s.length() + 20);
  89.                 sb.append('\"');
  90.                 for (int i = 0; i < s.length(); i++)
  91.                 {
  92.                         final char c = s.charAt(i);
  93.                         switch (c)
  94.                         {
  95.                         case '\"':
  96.                                 sb.append("\\\"");
  97.                                 break;
  98.                         case '\\':
  99.                                 sb.append("\\\\");
  100.                                 break;
  101.                         case '/':
  102.                                 sb.append("\\/");
  103.                                 break;
  104.                         case '\b':
  105.                                 sb.append("\\b");
  106.                                 break;
  107.                         case '\f':
  108.                                 sb.append("\\f");
  109.                                 break;
  110.                         case '\n':
  111.                                 sb.append("\\n");
  112.                                 break;
  113.                         case '\r':
  114.                                 sb.append("\\r");
  115.                                 break;
  116.                         case '\t':
  117.                                 sb.append("\\t");
  118.                                 break;
  119.                         default:
  120.                                 sb.append(c);
  121.                         }
  122.                 }
  123.                 sb.append('\"');
  124.                 return sb.toString();
  125.         }

  126.         /**
  127.          * 将 Number 表示为 JSON格式
  128.          * 
  129.          * @param number
  130.          *            Number
  131.          * @return JSON格式
  132.          */
  133.         static String number2Json(final Number number)
  134.         {
  135.                 return number.toString();
  136.         }

  137.         /**
  138.          * 将 Boolean 表示为 JSON格式
  139.          * 
  140.          * @param bool
  141.          *            Boolean
  142.          * @return JSON格式
  143.          */
  144.         static String boolean2Json(final Boolean bool)
  145.         {
  146.                 return bool.toString();
  147.         }

  148.         /**
  149.          * 将 Collection 编码为 JSON 格式 (List,Set)
  150.          * 
  151.          * @param c
  152.          * @return
  153.          */
  154.         static String collection2Json(final Collection<Object> c)
  155.         {
  156.                 final Object[] arrObj = c.toArray();
  157.                 return toJson(arrObj);
  158.         }

  159.         /**
  160.          * 将 Map<String, Object> 编码为 JSON 格式
  161.          * 
  162.          * @param map
  163.          * @return
  164.          */
  165.         static String map2Json(final Map<String, Object> map)
  166.         {
  167.                 if (map.isEmpty())
  168.                 {
  169.                         return "{}";
  170.                 }
  171.                 final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方
  172.                 sb.append('{');
  173.                 final Set<String> keys = map.keySet();
  174.                 for (final String key : keys)
  175.                 {
  176.                         final Object value = map.get(key);
  177.                         sb.append('\"');
  178.                         sb.append(key); //不能包含特殊字符
  179.                         sb.append('\"');
  180.                         sb.append(':');
  181.                         sb.append(toJson(value)); //循环引用的对象会引发无限递归
  182.                         sb.append(',');
  183.                 }
  184.                 // 将最后的 ',' 变为 '}': 
  185.                 sb.setCharAt(sb.length() - 1, '}');
  186.                 return sb.toString();
  187.         }

  188.         /**
  189.          * 将数组编码为 JSON 格式
  190.          * 
  191.          * @param array
  192.          *            数组
  193.          * @return JSON 格式
  194.          */
  195.         static String array2Json(final Object[] array)
  196.         {
  197.                 if (array.length == 0)
  198.                 {
  199.                         return "[]";
  200.                 }
  201.                 final StringBuilder sb = new StringBuilder(array.length << 4); //4次方
  202.                 sb.append('[');
  203.                 for (final Object o : array)
  204.                 {
  205.                         sb.append(toJson(o));
  206.                         sb.append(',');
  207.                 }
  208.                 // 将最后添加的 ',' 变为 ']': 
  209.                 sb.setCharAt(sb.length() - 1, ']');
  210.                 return sb.toString();
  211.         }

  212.         static String intArray2Json(final int[] array)
  213.         {
  214.                 if (array.length == 0)
  215.                 {
  216.                         return "[]";
  217.                 }
  218.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  219.                 sb.append('[');
  220.                 for (final int o : array)
  221.                 {
  222.                         sb.append(Integer.toString(o));
  223.                         sb.append(',');
  224.                 }
  225.                 // set last ',' to ']':
  226.                 sb.setCharAt(sb.length() - 1, ']');
  227.                 return sb.toString();
  228.         }

  229.         static String longArray2Json(final long[] array)
  230.         {
  231.                 if (array.length == 0)
  232.                 {
  233.                         return "[]";
  234.                 }
  235.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  236.                 sb.append('[');
  237.                 for (final long o : array)
  238.                 {
  239.                         sb.append(Long.toString(o));
  240.                         sb.append(',');
  241.                 }
  242.                 // set last ',' to ']':
  243.                 sb.setCharAt(sb.length() - 1, ']');
  244.                 return sb.toString();
  245.         }

  246.         static String booleanArray2Json(final boolean[] array)
  247.         {
  248.                 if (array.length == 0)
  249.                 {
  250.                         return "[]";
  251.                 }
  252.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  253.                 sb.append('[');
  254.                 for (final boolean o : array)
  255.                 {
  256.                         sb.append(Boolean.toString(o));
  257.                         sb.append(',');
  258.                 }
  259.                 // set last ',' to ']':
  260.                 sb.setCharAt(sb.length() - 1, ']');
  261.                 return sb.toString();
  262.         }

  263.         static String floatArray2Json(final float[] array)
  264.         {
  265.                 if (array.length == 0)
  266.                 {
  267.                         return "[]";
  268.                 }
  269.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  270.                 sb.append('[');
  271.                 for (final float o : array)
  272.                 {
  273.                         sb.append(Float.toString(o));
  274.                         sb.append(',');
  275.                 }
  276.                 // set last ',' to ']':
  277.                 sb.setCharAt(sb.length() - 1, ']');
  278.                 return sb.toString();
  279.         }

  280.         static String doubleArray2Json(final double[] array)
  281.         {
  282.                 if (array.length == 0)
  283.                 {
  284.                         return "[]";
  285.                 }
  286.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  287.                 sb.append('[');
  288.                 for (final double o : array)
  289.                 {
  290.                         sb.append(Double.toString(o));
  291.                         sb.append(',');
  292.                 }
  293.                 // set last ',' to ']':
  294.                 sb.setCharAt(sb.length() - 1, ']');
  295.                 return sb.toString();
  296.         }

  297.         static String shortArray2Json(final short[] array)
  298.         {
  299.                 if (array.length == 0)
  300.                 {
  301.                         return "[]";
  302.                 }
  303.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  304.                 sb.append('[');
  305.                 for (final short o : array)
  306.                 {
  307.                         sb.append(Short.toString(o));
  308.                         sb.append(',');
  309.                 }
  310.                 // set last ',' to ']':
  311.                 sb.setCharAt(sb.length() - 1, ']');
  312.                 return sb.toString();
  313.         }

  314.         static String byteArray2Json(final byte[] array)
  315.         {
  316.                 if (array.length == 0)
  317.                 {
  318.                         return "[]";
  319.                 }
  320.                 final StringBuilder sb = new StringBuilder(array.length << 4);
  321.                 sb.append('[');
  322.                 for (final byte o : array)
  323.                 {
  324.                         sb.append(Byte.toString(o));
  325.                         sb.append(',');
  326.                 }
  327.                 // set last ',' to ']':
  328.                 sb.setCharAt(sb.length() - 1, ']');
  329.                 return sb.toString();
  330.         }

  331.         public static String object2Json(final Object bean)
  332.         {
  333.                 //数据检查
  334.                 if (bean == null)
  335.                 {
  336.                         return "{}";
  337.                 }
  338.                 final Method[] methods = bean.getClass().getMethods(); //方法数组
  339.                 final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方
  340.                 sb.append('{');

  341.                 for (final Method method : methods)
  342.                 {
  343.                         try
  344.                         {
  345.                                 final String name = method.getName();
  346.                                 String key = "";
  347.                                 if (name.startsWith("get"))
  348.                                 {
  349.                                         key = name.substring(3);

  350.                                         //防死循环
  351.                                         final String[] arrs =
  352.                                         { "Class" };
  353.                                         boolean bl = false;
  354.                                         for (final String s : arrs)
  355.                                         {
  356.                                                 if (s.equals(key))
  357.                                                 {
  358.                                                         bl = true;
  359.                                                         continue;
  360.                                                 }
  361.                                         }
  362.                                         if (bl)
  363.                                         {
  364.                                                 continue; //防死循环
  365.                                         }
  366.                                 }
  367.                                 else if (name.startsWith("is"))
  368.                                 {
  369.                                         key = name.substring(2);
  370.                                 }
  371.                                 if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)
  372.                                 {
  373.                                         if (key.length() == 1)
  374.                                         {
  375.                                                 key = key.toLowerCase();
  376.                                         }
  377.                                         else if (!Character.isUpperCase(key.charAt(1)))
  378.                                         {
  379.                                                 key = key.substring(0, 1).toLowerCase() + key.substring(1);
  380.                                         }
  381.                                         final Object elementObj = method.invoke(bean);

  382.                                         //System.out.println("###" + key + ":" + elementObj.toString());

  383.                                         sb.append('\"');
  384.                                         sb.append(key); //不能包含特殊字符
  385.                                         sb.append('\"');
  386.                                         sb.append(':');
  387.                                         sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归
  388.                                         sb.append(',');
  389.                                 }
  390.                         }
  391.                         catch (final Exception e)
  392.                         {
  393.                                 //e.getMessage();
  394.                                 throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);
  395.                         }
  396.                 }
  397.                 if (sb.length() == 1)
  398.                 {
  399.                         return bean.toString();
  400.                 }
  401.                 else
  402.                 {
  403.                         sb.setCharAt(sb.length() - 1, '}');
  404.                         return sb.toString();
  405.                 }
  406.         }

  407.         private JsonUtil()
  408.         {
  409.         }
  410. }
复制代码
原创粉丝点击