`

java bean 转为JSON

阅读更多

2010-4-12 补:可以参看:   http://jiangzhengjun.iteye.com/category/78136

 

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

 

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

 

这是 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()
	{
	}
}

 

7
1
分享到:
评论
7 楼 wzwahl36 2015-10-27  
http://www.atool.org/json2javabean.php json转pojo,一键打包下载~很赞!
6 楼 xzz7175327 2013-04-08  
不错!顶lz
5 楼 add2ws 2011-04-05  
lz好人  !
4 楼 justshare 2009-03-02  
楼主小眼睛,色迷迷的眼神。。。扑倒
3 楼 czpae86 2008-12-28  
2 楼 arpenker 2008-11-04  
楼主,互联网就要这个味!
1 楼 我奋斗 2008-10-30  
很强大!很好!

相关推荐

    JAVA-JSON工具转换类

    在处理JSON时,可能需要将JSON解析得到的数据转换成特定的对象类型,或者将Java对象转换成适合JSON格式的数据,这时候`ezmorph`就可以派上用场。它可以方便地将一种类型的数据转换成另一种类型,比如将字符串转成...

    JavaBean与JsonString的相互转换

    JavaBean是Java对象的一种规范,用于封装数据,而JsonString是一种轻量级的数据交换格式,常用于前后端交互。本篇将深入探讨JavaBean与JsonString之间的相互转换方法。 1. **什么是JavaBean** JavaBean是一种遵循...

    JAVA对象转化为JSON

    6. **`ezmorph-1.0.6.jar`**:EZMorph库主要用于Java对象的动态转换,虽然不是直接用于JSON转换,但在需要将Java对象转换成适合JSON格式的类型时,可能会用到。 在实际应用中,如果你对JSON的结构有严格的要求,如...

    javabean转换为json格式用到的所有包

    在Java开发中,将数据对象(如Javabean、List、Map...同时,这些库还提供了对List和Map的转换支持,使得数组和映射结构的数据也能顺利转为JSON格式。在项目中引入这些依赖,可以极大地提高开发效率并保证转换的正确性。

    gson 字符串,java bean 对象转化,jar和源码.zip

    通过Gson,我们可以方便地将一个Java Bean实例转化为JSON格式的字符串。以下是一个简单的例子: ```java import com.google.gson.Gson; public class User { private String name; private int age; // ...

    读取文件数据并解析成bean实体类

    4. **对象映射(对象-XML/JSON映射)**:这是一种将数据结构(如Bean)与数据格式(如XML或JSON)之间进行转换的技术。比如,使用Jackson库的`ObjectMapper`可以方便地将JSON字符串解析成Bean,反之亦然。 5. **...

    json与bean,array,list,map,简单类型之间的封装、解析

    例如,将一个`String`数组转换为JSON格式: ```java String[] names = {"Alice", "Bob", "Charlie"}; String jsonArrayString = gson.toJson(names); ``` 反之,将JSON数组解析为`String`数组: ```java String ...

    首字母大写的json串转为javabean实例

    当你从服务器获取到JSON格式的数据后,通常会希望将其映射到Java对象上,以便进行更方便的操作和处理。 标题中的“首字母大写的json串转为javabean实例”意味着我们需要处理JSON字符串中属性名首字母大写的情况。在...

    List转换为List

    在Web开发中,尤其是前后端分离的项目,经常需要将后端Java对象转换为JSON格式的数据,以便前端能够接收和解析。在Java中,最常用的JSON处理库之一是Jackson。 #### 转换步骤: 1. **创建JsonFactory实例**:使用...

    开发中复杂Json解析(LinkedTreeMap)

    1,先将接口返回的JSON,用gson.tojson(map)方法,将LinkedTreeMap对象转成String。 2,再通过gson.fromjson(string,type)方法,将String转成LinkedTreeMap。用到了Type type=new TypeToken(){}.getType; 3,再将...

    详谈Java中net.sf.json包关于JSON与对象互转的坑

    GSON则是由谷歌提供的,它能够将Java对象自动转换成JSON格式,并且能够处理复杂的对象类型;jackson则以其模块化和灵活性著称。如果要避免“net.sf.json”包中所提到的问题,开发者应该考虑使用这些更为现代和活跃的...

    yaml-json:使用Jakarta JSON API以Java读写YAML

    JSON-B提供了Java Bean到JSON的自动绑定,而JSON-P提供了JSON解析和生成的API。 1. **将YAML转换为JSON**: - 首先,我们需要一个YAML字符串或YAML文件。使用SnakeYAML的`Yaml`类加载YAML数据。 - 然后,将YAML...

    Java中驼峰与下划线相互转换

    在实际开发中,这些转换方法可以方便地用于数据格式的统一,特别是在处理数据库字段名和Java对象属性之间的映射,或者在解析和生成JSON字符串时。确保代码遵循一致的命名规范可以提高代码的可读性,降低维护成本。...

    Json 自定义使用函数的简单实例

    2. `string2Json(String s)`:此方法将一个字符串转为JSON格式的字符串,确保特殊字符被转义。例如,双引号`"`变为`\\"`,反斜杠`\`变为`\\`等。这遵循JSON规范,防止字符串中包含的特殊字符导致解析错误。 3. `to...

    commnos jar包

    JSON Lib提供了将Java对象转换为JSON格式和从JSON数据创建Java对象的功能。Ezmorph 1.0.6是一个Java库,主要用于对象的类型转换,它简化了在Java中将一个对象转换为另一种类型的过程。同时,描述中提及的"commons-...

    springmvc图片上传及json数据转换过程详解

    接下来,关于JSON数据转换,Spring MVC提供了注解ResponseBody,使用这个注解可以将方法的返回值自动转换成JSON格式的响应体。这主要依赖于Spring MVC的自动消息转换机制,当返回值类型是String、int、Map、POJO等时...

    java中实现map与对象相互转换的几种实现

    return gson.fromJson(gson.toJson(map), beanClass); } public static Map, Object&gt; objectToMap(Object obj) { if (obj == null) { return null; } Gson gson = new Gson(); return gson.fromJson(gson.to...

    springboot实现参数的驼峰与下划线的自动转换配置

    springboot中参数进行驼峰与下划线的自动转换配置,实现参数传入时是下划线、java后台接收变成驼峰、返回前端又转为下划线

    Java lambda list转换map时,把多个参数拼接作为key操作

    Java lambda list转换map时,把多个参数拼接作为key操作 Java lambda list转换map时,把多个参数拼接作为key操作是Java开发中常见的操作。下面将详细介绍该操作的实现方法和需要注意的两个大坑。 一、Java lambda ...

Global site tag (gtag.js) - Google Analytics