- 浏览: 10761 次
- 性别:
- 来自: 深圳
-
最新评论
-
lwz5910:
学不止 写道女生吗??? 你太厉害了支持一下。我也有应用在机锋 ...
抓蝴蝶 我自己开发的第一款游戏-技术说明 -
学不止:
女生吗??? 你太厉害了支持一下。我也有应用在机锋市场可以私下 ...
抓蝴蝶 我自己开发的第一款游戏-技术说明
这是一个工具类,不依赖于其它第三方的库,用于响应AJAX的请求时,把服务器端的一个对象(一般是POJO类,或是集合),封装成JSON格式,来响应AJAX的请求,也就是把这个对象,原样搬到客户端的浏览器内存中,可以用JS访问。
后面有可下载的ZIP包, 内有所有代码,包括测试的类。
这是 JsonUtil类部分:
Java代码
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);
}
}
sb.append('\"');
return sb.toString();
}
/**
* 将 Number 表示为 JSON格式
*
* @param number
* Number
* @return JSON格式
*/
static String number2Json(final Number number)
{
return number.toString();
}
/**
* 将 Boolean 表示为 JSON格式
*
* @param bool
* Boolean
* @return JSON格式
*/
static String boolean2Json(final Boolean bool)
{
return bool.toString();
}
/**
* 将 Collection 编码为 JSON 格式 (List,Set)
*
* @param c
* @return
*/
static String collection2Json(final Collection<Object> c)
{
final Object[] arrObj = c.toArray();
return toJson(arrObj);
}
/**
* 将 Map<String, Object> 编码为 JSON 格式
*
* @param map
* @return
*/
static String map2Json(final Map<String, Object> map)
{
if (map.isEmpty())
{
return "{}";
}
final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方
sb.append('{');
final Set<String> keys = map.keySet();
for (final String key : keys)
{
final Object value = map.get(key);
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(value)); //循环引用的对象会引发无限递归
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
/**
* 将数组编码为 JSON 格式
*
* @param array
* 数组
* @return JSON 格式
*/
static String array2Json(final Object[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4); //4次方
sb.append('[');
for (final Object o : array)
{
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String intArray2Json(final int[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final int o : array)
{
sb.append(Integer.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String longArray2Json(final long[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final long o : array)
{
sb.append(Long.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String booleanArray2Json(final boolean[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final boolean o : array)
{
sb.append(Boolean.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String floatArray2Json(final float[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final float o : array)
{
sb.append(Float.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String doubleArray2Json(final double[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final double o : array)
{
sb.append(Double.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String shortArray2Json(final short[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final short o : array)
{
sb.append(Short.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String byteArray2Json(final byte[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final byte o : array)
{
sb.append(Byte.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static String object2Json(final Object bean)
{
//数据检查
if (bean == null)
{
return "{}";
}
final Method[] methods = bean.getClass().getMethods(); //方法数组
final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方
sb.append('{');
for (final Method method : methods)
{
try
{
final String name = method.getName();
String key = "";
if (name.startsWith("get"))
{
key = name.substring(3);
//防死循环
final String[] arrs =
{ "Class" };
boolean bl = false;
for (final String s : arrs)
{
if (s.equals(key))
{
bl = true;
continue;
}
}
if (bl)
{
continue; //防死循环
}
}
else if (name.startsWith("is"))
{
key = name.substring(2);
}
if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)
{
if (key.length() == 1)
{
key = key.toLowerCase();
}
else if (!Character.isUpperCase(key.charAt(1)))
{
key = key.substring(0, 1).toLowerCase() + key.substring(1);
}
final Object elementObj = method.invoke(bean);
//System.out.println("###" + key + ":" + elementObj.toString());
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归
sb.append(',');
}
}
catch (final Exception e)
{
//e.getMessage();
throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);
}
}
if (sb.length() == 1)
{
return bean.toString();
}
else
{
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
}
private JsonUtil()
{
}
}
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);
}
}
sb.append('\"');
return sb.toString();
}
/**
* 将 Number 表示为 JSON格式
*
* @param number
* Number
* @return JSON格式
*/
static String number2Json(final Number number)
{
return number.toString();
}
/**
* 将 Boolean 表示为 JSON格式
*
* @param bool
* Boolean
* @return JSON格式
*/
static String boolean2Json(final Boolean bool)
{
return bool.toString();
}
/**
* 将 Collection 编码为 JSON 格式 (List,Set)
*
* @param c
* @return
*/
static String collection2Json(final Collection<Object> c)
{
final Object[] arrObj = c.toArray();
return toJson(arrObj);
}
/**
* 将 Map<String, Object> 编码为 JSON 格式
*
* @param map
* @return
*/
static String map2Json(final Map<String, Object> map)
{
if (map.isEmpty())
{
return "{}";
}
final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方
sb.append('{');
final Set<String> keys = map.keySet();
for (final String key : keys)
{
final Object value = map.get(key);
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(value)); //循环引用的对象会引发无限递归
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
/**
* 将数组编码为 JSON 格式
*
* @param array
* 数组
* @return JSON 格式
*/
static String array2Json(final Object[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4); //4次方
sb.append('[');
for (final Object o : array)
{
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String intArray2Json(final int[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final int o : array)
{
sb.append(Integer.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String longArray2Json(final long[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final long o : array)
{
sb.append(Long.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String booleanArray2Json(final boolean[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final boolean o : array)
{
sb.append(Boolean.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String floatArray2Json(final float[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final float o : array)
{
sb.append(Float.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String doubleArray2Json(final double[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final double o : array)
{
sb.append(Double.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String shortArray2Json(final short[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final short o : array)
{
sb.append(Short.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String byteArray2Json(final byte[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final byte o : array)
{
sb.append(Byte.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static String object2Json(final Object bean)
{
//数据检查
if (bean == null)
{
return "{}";
}
final Method[] methods = bean.getClass().getMethods(); //方法数组
final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方
sb.append('{');
for (final Method method : methods)
{
try
{
final String name = method.getName();
String key = "";
if (name.startsWith("get"))
{
key = name.substring(3);
//防死循环
final String[] arrs =
{ "Class" };
boolean bl = false;
for (final String s : arrs)
{
if (s.equals(key))
{
bl = true;
continue;
}
}
if (bl)
{
continue; //防死循环
}
}
else if (name.startsWith("is"))
{
key = name.substring(2);
}
if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)
{
if (key.length() == 1)
{
key = key.toLowerCase();
}
else if (!Character.isUpperCase(key.charAt(1)))
{
key = key.substring(0, 1).toLowerCase() + key.substring(1);
}
final Object elementObj = method.invoke(bean);
//System.out.println("###" + key + ":" + elementObj.toString());
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归
sb.append(',');
}
}
catch (final Exception e)
{
//e.getMessage();
throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);
}
}
if (sb.length() == 1)
{
return bean.toString();
}
else
{
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
}
private JsonUtil()
{
}
}
后面有可下载的ZIP包, 内有所有代码,包括测试的类。
这是 JsonUtil类部分:
Java代码
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);
}
}
sb.append('\"');
return sb.toString();
}
/**
* 将 Number 表示为 JSON格式
*
* @param number
* Number
* @return JSON格式
*/
static String number2Json(final Number number)
{
return number.toString();
}
/**
* 将 Boolean 表示为 JSON格式
*
* @param bool
* Boolean
* @return JSON格式
*/
static String boolean2Json(final Boolean bool)
{
return bool.toString();
}
/**
* 将 Collection 编码为 JSON 格式 (List,Set)
*
* @param c
* @return
*/
static String collection2Json(final Collection<Object> c)
{
final Object[] arrObj = c.toArray();
return toJson(arrObj);
}
/**
* 将 Map<String, Object> 编码为 JSON 格式
*
* @param map
* @return
*/
static String map2Json(final Map<String, Object> map)
{
if (map.isEmpty())
{
return "{}";
}
final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方
sb.append('{');
final Set<String> keys = map.keySet();
for (final String key : keys)
{
final Object value = map.get(key);
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(value)); //循环引用的对象会引发无限递归
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
/**
* 将数组编码为 JSON 格式
*
* @param array
* 数组
* @return JSON 格式
*/
static String array2Json(final Object[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4); //4次方
sb.append('[');
for (final Object o : array)
{
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String intArray2Json(final int[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final int o : array)
{
sb.append(Integer.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String longArray2Json(final long[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final long o : array)
{
sb.append(Long.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String booleanArray2Json(final boolean[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final boolean o : array)
{
sb.append(Boolean.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String floatArray2Json(final float[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final float o : array)
{
sb.append(Float.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String doubleArray2Json(final double[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final double o : array)
{
sb.append(Double.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String shortArray2Json(final short[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final short o : array)
{
sb.append(Short.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String byteArray2Json(final byte[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final byte o : array)
{
sb.append(Byte.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static String object2Json(final Object bean)
{
//数据检查
if (bean == null)
{
return "{}";
}
final Method[] methods = bean.getClass().getMethods(); //方法数组
final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方
sb.append('{');
for (final Method method : methods)
{
try
{
final String name = method.getName();
String key = "";
if (name.startsWith("get"))
{
key = name.substring(3);
//防死循环
final String[] arrs =
{ "Class" };
boolean bl = false;
for (final String s : arrs)
{
if (s.equals(key))
{
bl = true;
continue;
}
}
if (bl)
{
continue; //防死循环
}
}
else if (name.startsWith("is"))
{
key = name.substring(2);
}
if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)
{
if (key.length() == 1)
{
key = key.toLowerCase();
}
else if (!Character.isUpperCase(key.charAt(1)))
{
key = key.substring(0, 1).toLowerCase() + key.substring(1);
}
final Object elementObj = method.invoke(bean);
//System.out.println("###" + key + ":" + elementObj.toString());
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归
sb.append(',');
}
}
catch (final Exception e)
{
//e.getMessage();
throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);
}
}
if (sb.length() == 1)
{
return bean.toString();
}
else
{
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
}
private JsonUtil()
{
}
}
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);
}
}
sb.append('\"');
return sb.toString();
}
/**
* 将 Number 表示为 JSON格式
*
* @param number
* Number
* @return JSON格式
*/
static String number2Json(final Number number)
{
return number.toString();
}
/**
* 将 Boolean 表示为 JSON格式
*
* @param bool
* Boolean
* @return JSON格式
*/
static String boolean2Json(final Boolean bool)
{
return bool.toString();
}
/**
* 将 Collection 编码为 JSON 格式 (List,Set)
*
* @param c
* @return
*/
static String collection2Json(final Collection<Object> c)
{
final Object[] arrObj = c.toArray();
return toJson(arrObj);
}
/**
* 将 Map<String, Object> 编码为 JSON 格式
*
* @param map
* @return
*/
static String map2Json(final Map<String, Object> map)
{
if (map.isEmpty())
{
return "{}";
}
final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方
sb.append('{');
final Set<String> keys = map.keySet();
for (final String key : keys)
{
final Object value = map.get(key);
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(value)); //循环引用的对象会引发无限递归
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
/**
* 将数组编码为 JSON 格式
*
* @param array
* 数组
* @return JSON 格式
*/
static String array2Json(final Object[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4); //4次方
sb.append('[');
for (final Object o : array)
{
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String intArray2Json(final int[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final int o : array)
{
sb.append(Integer.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String longArray2Json(final long[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final long o : array)
{
sb.append(Long.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String booleanArray2Json(final boolean[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final boolean o : array)
{
sb.append(Boolean.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String floatArray2Json(final float[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final float o : array)
{
sb.append(Float.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String doubleArray2Json(final double[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final double o : array)
{
sb.append(Double.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String shortArray2Json(final short[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final short o : array)
{
sb.append(Short.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
static String byteArray2Json(final byte[] array)
{
if (array.length == 0)
{
return "[]";
}
final StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (final byte o : array)
{
sb.append(Byte.toString(o));
sb.append(',');
}
// set last ',' to ']':
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static String object2Json(final Object bean)
{
//数据检查
if (bean == null)
{
return "{}";
}
final Method[] methods = bean.getClass().getMethods(); //方法数组
final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方
sb.append('{');
for (final Method method : methods)
{
try
{
final String name = method.getName();
String key = "";
if (name.startsWith("get"))
{
key = name.substring(3);
//防死循环
final String[] arrs =
{ "Class" };
boolean bl = false;
for (final String s : arrs)
{
if (s.equals(key))
{
bl = true;
continue;
}
}
if (bl)
{
continue; //防死循环
}
}
else if (name.startsWith("is"))
{
key = name.substring(2);
}
if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)
{
if (key.length() == 1)
{
key = key.toLowerCase();
}
else if (!Character.isUpperCase(key.charAt(1)))
{
key = key.substring(0, 1).toLowerCase() + key.substring(1);
}
final Object elementObj = method.invoke(bean);
//System.out.println("###" + key + ":" + elementObj.toString());
sb.append('\"');
sb.append(key); //不能包含特殊字符
sb.append('\"');
sb.append(':');
sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归
sb.append(',');
}
}
catch (final Exception e)
{
//e.getMessage();
throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);
}
}
if (sb.length() == 1)
{
return bean.toString();
}
else
{
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
}
private JsonUtil()
{
}
}
相关推荐
内容概要:本文介绍了AI绘画工具Craiyon,它由Google和Hugging Face研究人员开发,是DALL-E mini的后续版本。Craiyon以其简便的操作、强大的创意激发能力和快速生成图像的特点受到欢迎。用户只需简单输入文字描述,Craiyon即可生成图像,极大地降低了绘画门槛。文章还探讨了Craiyon面临的挑战,包括版权争议、图像质量提升空间和艺术本质的讨论。最后,展望了Craiyon在教育、商业等领域的应用前景,强调其在未来创意和科技融合中的重要性。 适合人群:适合所有对AI绘画感兴趣的用户,尤其是零基础的艺术爱好者、设计师以及需要快速生成创意图像的专业人士。 使用场景及目标:①帮助设计师突破创意瓶颈,快速生成设计草图;②为普通用户提供实现梦想可视化的途径;③在教育领域辅助创意启发课程,提升学生创造力和跨学科学习能力;④在商业领域加快广告设计、游戏开发等项目的创意构思和制作进程。 其他说明:尽管Craiyon存在版权争议、图像质量有待提高等问题,但其简便易用的特点使其成为初学者和创意爱好者的理想选择。未来,随着技术的进步,Craiyon有望克服现有挑战,为用户提供更高质量的服务。
实训商业源码-智慧农场 1.9.2+农业众筹投资+活动报名+智慧农场拼团 +农场乐园-论文模板.zip
实训商业源码-图片表情-论文模板.zip
实训商业源码-微信·小程序模板社交圈-论文模板.zip
实训商业源码-智慧农场小程序1.8.9-论文模板.zip
使用MFC自制的人脸识别小软件,能够实现注册登录基础功能。可以在此基础上进一步开发,实现锁屏登录等功能
实训商业源码-文件快递-论文模板.zip
基于vue+javaScript实现的订货系统供货商后台系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于vue+javaScript实现的订货系统供货商后台系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于vue+javaScript实现的订货系统供货商后台系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于vue+javaScript实现的订货系统供货商后台系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于vue+javaScript实现的订货系统供货商后台系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于vue+javaScript实现的订货系统供货商后台系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用
面试题总结一,包括常见面试题
PT7C4512-PLL时钟倍频器-中文数据手册
内容概要:本文详细介绍了使用Matlab 2022a中的Simulink工具对风轮机发电系统进行全面建模与仿真的方法。主要内容涵盖风速模型(包括基本风、阵风、阶跃风和随机风)、风力机模型(涉及叶片、轴承、发电机等组件)以及飞轮储能模块的构建。通过这些模型,可以更真实地模拟风力发电系统的动态行为,帮助研究人员和工程师更好地理解风电系统的性能特点及其优化方向。 适合人群:从事风力发电系统研究的技术人员、高校相关专业师生、对风电系统感兴趣的科研工作者。 使用场景及目标:①用于风电场的设计和优化;②评估不同风速条件下的风力机性能;③研究飞轮储能模块对电力输出稳定性的贡献。 其他说明:文中提供了完整的Simulink工程源文件和参考文献,便于读者进一步学习和应用。
实训商业源码-微商城-论文模板.zip
天狼星网络验证,一个可以注入远程分享弹窗,网络验证的工具你还在用本地注册机吗?你想拥有远程分享弹窗的功能吗?即 刻起就摆脱本地,使用网络注册机! 天狼星网络验证破解,支持一键为软件注入弹窗式网络验证,一键为软件注入全屏式网络验证,支持跳加固注入网络验证, 支持远程引流分享弹窗等等,注入后的软件还有独特的签名验证,防二改,防抓包破解 计算机技术发展到今天,很多优秀的软件已经具备了商业价值,很多软件作者希望自己的软件具有注册功能,但是传统的注册 码解决不了多人使用同一个注册码的问题,机器码(本地验证)的方式又比较容易被破解。这些问题都成为大家制作收费软件 的首要问题刀客源码。本系统就是帮助大家解决这一系列问题。如果你想保护自己的知识产权及将自己的知识产权商业化, 你就一定的试试哦。 完全免费使用用户登录、卡密管理等基本功能,无需担心收费功能影响软件使用! 节省软件成本,不需要购置服务器,登录酸酸云科技后台配置自己的应用程序相关设置,客户端直接调用远程webservices就能 实现网络验证! 缩短开发周期不需要过多的繁琐操作,调用酸酸云科技就可以实现验证机制,无需再书写验证用户登录,用户管理,卡密管理等 繁琐的代码,开发软件只要专注程序代码即可! 安全防破解将重要数据存放在服务器中,只有当客户登陆成功后才会返回相应的重要数据,就算被破解,也有盗版弹窗,也是无 法使用! 支持多程序语言开发同时支持多种程序语言,只要程序能够调用DLL的程序语言都可以调用本插件,例如:按键精灵、易语 言、C#、C++等!
实训商业源码-智慧农场V1.9.0+拼团1.0.1+报名1.0.6+众筹投资1.1.0+农场乐园1.0.2-论文模板.zip
包含常用所需的全部固件,创建工程只需要复制工程,然后写入主程序代码即可
繁忙铁路干线施工天窗与列车运行图协同优化研究_于婕.pdf_ (1)
图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/148054080
cherry-MCP相关软件包,包括cherry-MCP组件(Windows版)如uv,uvx等等,以及Cherry-Studio、cursor,node的安装包,提供给需要学习cherry-MCP相关知识的同学。
内容概要:本文详细介绍了逆变器下垂控制技术在并网和孤岛模式下的具体实现方法。首先解释了下垂控制的基本概念及其重要性,然后通过具体的代码片段展示了不同模式(如并网模式、孤岛模式)下的控制逻辑。对于并网模式,逆变器跟随电网频率,而在孤岛模式下,则依靠下垂控制调节频率和电压。此外,还讨论了并联运行时可能出现的问题以及解决方案,如功率跷跷板现象和相应的滤波处理。最后,文章强调了实际调试过程中的一些经验和技巧,如动态调整下垂系数以应对不同负载情况。 适合人群:从事电力电子、微电网研究的技术人员,尤其是对逆变器下垂控制感兴趣的工程师。 使用场景及目标:适用于需要理解和实现逆变器下垂控制的工程项目,帮助工程师掌握如何在不同环境下配置和优化逆变器性能。 其他说明:文中提供了多个编程语言的实际代码示例,包括Python、C和Matlab,有助于读者更好地理解理论与实践的结合。同时,作者分享了许多来自真实项目的宝贵经验,使读者能够避免常见的错误和技术陷阱。
可以通过这个包让自己的keil5工作区看起来没那么辣眼睛(也许吧)