日期:2014-05-16 浏览次数:20505 次
package json;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
/**
* 作者 赵磊
*
* JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式 除了字符 ",\,/
* 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出 Object 对象在 JSON 中是用 {}
* 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>,而不是
* Java 的 Class 。注意 Key 只能用 String 表示。
*
* Prototype提供了 evalJSON() 方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量
*
*
*/
public final class JsonUtil
{
/**
* 把对象封装为JSON格式
*
* @param o
* 对象
* @return JSON格式
*/
@SuppressWarnings("unchecked")
public static String toJson(final Object o)
{
if (o == null)
{
return "null";
}
if (o instanceof String) //String
{
return string2Json((String) o);
}
if (o instanceof Boolean) //Boolean
{
return boolean2Json((Boolean) o);
}
if (o instanceof Number) //Number
{
return number2Json((Number) o);
}
if (o instanceof Map) //Map
{
return map2Json((Map<String, Object>) o);
}
if (o instanceof Collection) //List Set
{
return collection2Json((Collection) o);
}
if (o instanceof Object[]) //对象数组
{
return array2Json((Object[]) o);
}
if (o instanceof int[])//基本类型数组
{
return intArray2Json((int[]) o);
}
if (o instanceof boolean[])//基本类型数组
{
return booleanArray2Json((boolean[]) o);
}
if (o instanceof long[])//基本类型数组
{
return longArray2Json((long[]) o);
}
if (o instanceof float[])//基本类型数组
{
return floatArray2Json((float[]) o);
}
if (o instanceof double[])//基本类型数组
{
return doubleArray2Json((double[]) o);
}
if (o instanceof short[])//基本类型数组
{
return shortArray2Json((short[]) o);
}
if (o instanceof byte[])//基本类型数组
{
return byteArray2Json((byte[]) o);
}
if (o instanceof Object) //保底收尾对象
{
return object2Json(o);
}
throw new RuntimeException("不支持的类型: " + o.getClass().getName());
}
/**
* 将 String 对象编码为 JSON格式,只需处理好特殊字符
*
* @param s
* String 对象
* @return JSON格式
*/
static String string2Json(final String s)
{
final StringBuilder sb = new StringBuilder(s.length() + 20);
sb.append('\"');
for (int i = 0; i < s.length(); i++)
{
final char c = s.charAt(i);
switch (c)
{
case '\"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}