`
iffiffj
  • 浏览: 156791 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

简单的bean转换为json的类--依赖hibernate

阅读更多
主要是性能上比开源工具有所提升,没的JSON到BEAN的转换
public class SimpleJson {
	private static final Logger logger = LoggerFactory
			.getLogger(SimpleJson.class);
	private static final Map<String, Map<String, Getter>> CLASS_MAP = new HashMap<String, Map<String, Getter>>();
	public static final SimpleDateFormat SDF = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");

	private SimpleJson() {}

	public static Map<String, Getter> describe(Class<?> beanClass) {
		String className = beanClass.getName();
		Map<String, Getter> map = CLASS_MAP.get(className);
		map = map == null ? new HashMap<String, Getter>() : map;
		if (map.isEmpty()) {
			Class<?> clazz = beanClass;
			while (clazz != null && !clazz.getClass().equals(Object.class)) {
				for (Field field : clazz.getDeclaredFields()) {
					int mod = field.getModifiers();
					if (Modifier.isStatic(mod) || Modifier.isFinal(mod)
						|| Modifier.isNative(mod) || Modifier.isStrict(mod)
						|| Modifier.isSynchronized(mod)
						|| Modifier.isTransient(mod)) {
						continue;
					}
					try {
						Getter getter = ReflectHelper
								.getGetter(beanClass, field.getName());
						map.put(field.getName(), getter);
					} catch (Exception e) {}
				}
				clazz = clazz.getSuperclass();
			}
			CLASS_MAP.put(className, map);
		}
		return map;
	}

	public static Object getValue(String fieldName, Object bean) {
		Map<String, Getter> gettes = describe(bean.getClass());
		Getter get = gettes.get(fieldName);
		return get == null ? null : get.get(bean);
	}

	public static String toJSONString(Object value) {
		StringBuilder sb = new StringBuilder(1024);
		HashMap<Object, Boolean> cache = new HashMap<Object, Boolean>();
		toJSONString(value, sb, cache);
		String string = sb.toString();
		sb = null;
		cache.clear();
		cache = null;
		return string;
	}

	private static void toJSONString(Object value, StringBuilder sb,
			Map<Object, Boolean> cache) {
		if (value == null) {
			sb.append("null");
		} else if (value instanceof Map) {
			toJSONString((Map) value, sb, cache);
		} else if (value instanceof List) {
			toJSONString((List) value, sb, cache);
		} else if (value instanceof String) {
			sb.append("\"");
			escape((String) value, sb);
			sb.append("\"");
		} else if (value instanceof Character) {
			sb.append("\"");
			escape(value == null ? "" : value.toString(), sb);
			sb.append("\"");
		} else if (value instanceof Double) {
			Double d = (Double) value;
			sb.append((d.isInfinite() || d.isNaN()) ? "null" : d.toString());
		} else if (value instanceof Float) {
			Float f = (Float) value;
			sb.append((f.isInfinite() || f.isNaN()) ? "null" : f.toString());
		} else if (value instanceof Number) {
			sb.append(value.toString());
		} else if (value instanceof Boolean) {
			sb.append(value.toString());
		} else if (value instanceof Date) {
			sb.append("\"").append(SDF.format((Date) value)).append("\"");
		} else if (value.getClass().isEnum()) {
			sb.append("\"").append(((Enum) value).toString()).append("\"");
		} else {
			Map<String, Getter> getters = describe(value.getClass());
			if (cache.get(value) != null) {
				Getter get = getters.get("id");
				if (get != null) {
					Object v = get.get(value);
					sb.append("{");
					toJSONString("id", v, sb, cache);
					sb.append("}");
				}
				return;
			} else {
				cache.put(value, Boolean.TRUE);
			}
			boolean first = true;
			Iterator<Entry<String, Getter>> iter = getters.entrySet()
					.iterator();
			sb.append('{');
			while (iter.hasNext()) {
				Entry<String, Getter> entry = iter.next();
				String key = entry.getKey();
				Object v = entry.getValue().get(value);
				if (key == null || v == null) {
					continue;
				}
				if (first) {
					first = false;
				} else {
					sb.append(',');
				}
				toJSONString(entry.getKey(), v, sb, cache);
			}
			sb.append('}');
		}
	}

	private static void toJSONString(Map map, StringBuilder sb,
			Map<Object, Boolean> cache) {
		if (map == null) {
			sb.append("null");
		}
		boolean first = true;
		Iterator iter = map.entrySet().iterator();
		sb.append('{');
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			Object key = entry.getKey();
			Object v = entry.getValue();
			if (key == null || v == null) {
				continue;
			}
			if (first) {
				first = false;
			} else {
				sb.append(',');
			}
			toJSONString(String.valueOf(key), v, sb, cache);
		}
		sb.append('}');
	}

	private static void toJSONString(List list, StringBuilder sb,
			Map<Object, Boolean> cache) {
		if (list == null) {
			sb.append("null");
		}
		boolean first = true;
		Iterator iter = list.iterator();
		sb.append('[');
		while (iter.hasNext()) {
			if (first) {
				first = false;
			} else {
				sb.append(',');
			}
			Object value = iter.next();
			if (value == null) {
				sb.append("null");
				continue;
			}
			toJSONString(value, sb, cache);
		}
		sb.append(']');
	}

	private static void toJSONString(String key, Object value,
			StringBuilder sb, Map<Object, Boolean> cache) {
		sb.append('\"');
		if (key == null) {
			sb.append("null");
		} else {
			escape(key, sb);
		}
		sb.append('\"').append(':');
		toJSONString(value, sb, cache);
	}

	private static void escape(String s, StringBuilder sb) {
		for (int i = 0; i < s.length(); i++) {
			char ch = s.charAt(i);
			switch (ch) {
			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;
			case '/':
				sb.append("\\/");
				break;
			default:
				//Reference: http://www.unicode.org/versions/Unicode5.1.0/
				if ((ch >= '\u0000' && ch <= '\u001F')
					|| (ch >= '\u007F' && ch <= '\u009F')
					|| (ch >= '\u2000' && ch <= '\u20FF')) {
					String ss = Integer.toHexString(ch);
					sb.append("\\u");
					for (int k = 0; k < 4 - ss.length(); k++) {
						sb.append('0');
					}
					sb.append(ss.toUpperCase());
				} else {
					sb.append(ch);
				}
			}
		}//for
	}
}

No Hibernate
import java.beans.Introspector;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleJson {
	private static final Map<String, Map<String, Getter>> CLASS_MAP = new HashMap<String, Map<String, Getter>>();
	public static final SimpleDateFormat SDF = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");

	private SimpleJson() {
	}

	public static Map<String, Getter> describe(Class<?> beanClass) {
		String className = beanClass.getName();
		Map<String, Getter> map = CLASS_MAP.get(className);
		map = map == null ? new HashMap<String, Getter>() : map;
		if (map.isEmpty()) {
			Class<?> clazz = beanClass;
			while (clazz != null && !clazz.getClass().equals(Object.class)) {
				for (Field field : clazz.getDeclaredFields()) {
					int mod = field.getModifiers();
					if (Modifier.isStatic(mod) || Modifier.isFinal(mod)
							|| Modifier.isNative(mod) || Modifier.isStrict(mod)
							|| Modifier.isSynchronized(mod)
							|| Modifier.isTransient(mod)) {
						continue;
					}
					try {
						Getter getter = Getter.getGetterOrNull(beanClass, field
								.getName());
						map.put(field.getName(), getter);
					} catch (Exception e) {
					}
				}
				clazz = clazz.getSuperclass();
			}
			CLASS_MAP.put(className, map);
		}
		return map;
	}

	public static Object getValue(String fieldName, Object bean) {
		Map<String, Getter> gettes = describe(bean.getClass());
		Getter get = gettes.get(fieldName);
		return get == null ? null : get.get(bean);
	}

	public static String toJSONString(Object value) {
		StringBuilder sb = new StringBuilder(1024);
		HashMap<Object, Boolean> cache = new HashMap<Object, Boolean>();
		toJSONString(value, sb, cache);
		String string = sb.toString();
		sb = null;
		cache.clear();
		cache = null;
		return string;
	}

	private static void toJSONString(Object value, StringBuilder sb,
			Map<Object, Boolean> cache) {
		if (value == null) {
			sb.append("null");
		} else if (value instanceof Map) {
			toJSONString((Map) value, sb, cache);
		} else if (value instanceof List) {
			toJSONString((List) value, sb, cache);
		} else if (value instanceof String) {
			sb.append("\"");
			escape((String) value, sb);
			sb.append("\"");
		} else if (value instanceof Character) {
			sb.append("\"");
			escape(value == null ? "" : value.toString(), sb);
			sb.append("\"");
		} else if (value instanceof Double) {
			Double d = (Double) value;
			sb.append((d.isInfinite() || d.isNaN()) ? "null" : d.toString());
		} else if (value instanceof Float) {
			Float f = (Float) value;
			sb.append((f.isInfinite() || f.isNaN()) ? "null" : f.toString());
		} else if (value instanceof Number) {
			sb.append(value.toString());
		} else if (value instanceof Boolean) {
			sb.append(value.toString());
		} else if (value instanceof Date) {
			sb.append("\"").append(SDF.format((Date) value)).append("\"");
		} else if (value.getClass().isEnum()) {
			sb.append("\"").append(((Enum) value).toString()).append("\"");
		} else {
			Map<String, Getter> getters = describe(value.getClass());
			if (cache.get(value) != null) {
				Getter get = getters.get("id");
				if (get != null) {
					Object v = get.get(value);
					sb.append("{");
					toJSONString("id", v, sb, cache);
					sb.append("}");
				}
				return;
			} else {
				cache.put(value, Boolean.TRUE);
			}
			boolean first = true;
			Iterator<Entry<String, Getter>> iter = getters.entrySet()
					.iterator();
			sb.append('{');
			while (iter.hasNext()) {
				Entry<String, Getter> entry = iter.next();
				String key = entry.getKey();
				Object v = entry.getValue().get(value);
				if (key == null || v == null) {
					continue;
				}
				if (first) {
					first = false;
				} else {
					sb.append(',');
				}
				toJSONString(entry.getKey(), v, sb, cache);
			}
			sb.append('}');
		}
	}

	private static void toJSONString(Map map, StringBuilder sb,
			Map<Object, Boolean> cache) {
		if (map == null) {
			sb.append("null");
		}
		boolean first = true;
		Iterator iter = map.entrySet().iterator();
		sb.append('{');
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			Object key = entry.getKey();
			Object v = entry.getValue();
			if (key == null || v == null) {
				continue;
			}
			if (first) {
				first = false;
			} else {
				sb.append(',');
			}
			toJSONString(String.valueOf(key), v, sb, cache);
		}
		sb.append('}');
	}

	private static void toJSONString(List list, StringBuilder sb,
			Map<Object, Boolean> cache) {
		if (list == null) {
			sb.append("null");
		}
		boolean first = true;
		Iterator iter = list.iterator();
		sb.append('[');
		while (iter.hasNext()) {
			if (first) {
				first = false;
			} else {
				sb.append(',');
			}
			Object value = iter.next();
			if (value == null) {
				sb.append("null");
				continue;
			}
			toJSONString(value, sb, cache);
		}
		sb.append(']');
	}

	private static void toJSONString(String key, Object value,
			StringBuilder sb, Map<Object, Boolean> cache) {
		sb.append('\"');
		if (key == null) {
			sb.append("null");
		} else {
			escape(key, sb);
		}
		sb.append('\"').append(':');
		toJSONString(value, sb, cache);
	}

	private static void escape(String s, StringBuilder sb) {
		for (int i = 0; i < s.length(); i++) {
			char ch = s.charAt(i);
			switch (ch) {
			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;
			case '/':
				sb.append("\\/");
				break;
			default:
				//Reference: http://www.unicode.org/versions/Unicode5.1.0/
				if ((ch >= '\u0000' && ch <= '\u001F')
						|| (ch >= '\u007F' && ch <= '\u009F')
						|| (ch >= '\u2000' && ch <= '\u20FF')) {
					String ss = Integer.toHexString(ch);
					sb.append("\\u");
					for (int k = 0; k < 4 - ss.length(); k++) {
						sb.append('0');
					}
					sb.append(ss.toUpperCase());
				} else {
					sb.append(ch);
				}
			}
		}//for
	}

	public static final class Getter {
		private Class<?> clazz;
		private final transient Method method;
		private final String propertyName;

		private Getter(Class<?> clazz, Method method, String propertyName) {
			this.clazz = clazz;
			this.method = method;
			this.propertyName = propertyName;
		}

		public static boolean isPublic(Class<?> clazz, Member member) {
			return ((Modifier.isPublic(member.getModifiers())) && (Modifier
					.isPublic(clazz.getModifiers())));
		}

		public static Getter getGetterOrNull(Class<?> theClass,
				String propertyName) {
			if ((theClass == Object.class) || (theClass == null)) {
				return null;
			}

			Method method = getterMethod(theClass, propertyName);

			if (method != null) {
				if (isPublic(theClass, method))
					method.setAccessible(true);
				return new Getter(theClass, method, propertyName);
			}

			Getter getter = getGetterOrNull(theClass.getSuperclass(),
					propertyName);
			if (getter == null) {
				Class[] interfaces = theClass.getInterfaces();
				for (int i = 0; (getter == null) && (i < interfaces.length); ++i) {
					getter = getGetterOrNull(interfaces[i], propertyName);
				}
			}
			return getter;
		}

		private static Method getterMethod(Class theClass, String propertyName) {
			Method[] methods = theClass.getDeclaredMethods();
			for (int i = 0; i < methods.length; ++i) {
				if (methods[i].getParameterTypes().length == 0) {
					String methodName = methods[i].getName();

					if (methodName.startsWith("get")) {
						String testStdMethod = Introspector
								.decapitalize(methodName.substring(3));
						String testOldMethod = methodName.substring(3);
						if ((testStdMethod.equals(propertyName))
								|| (testOldMethod.equals(propertyName))) {
							return methods[i];
						}

					}

					if (methodName.startsWith("is")) {
						String testStdMethod = Introspector
								.decapitalize(methodName.substring(2));
						String testOldMethod = methodName.substring(2);
						if ((testStdMethod.equals(propertyName))
								|| (testOldMethod.equals(propertyName))) {
							return methods[i];
						}
					}
				}
			}
			return null;
		}

		public Object get(Object target) {
			try {
				return this.method.invoke(target, null);
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		public Object getForInsert(Object target, Map<?, ?> mergeMap) {
			return get(target);
		}

		public Class<?> getReturnType() {
			return this.method.getReturnType();
		}

		public Member getMember() {
			return this.method;
		}

		public Method getMethod() {
			return this.method;
		}

		public String getMethodName() {
			return this.method.getName();
		}

		public String toString() {
			return "Getter(" + this.clazz.getName() + '.' + this.propertyName
					+ ')';
		}
	}

	public static void main(String[] args) {
		List<Object> list = new ArrayList<Object>();
		for (int i = 0; i < 3; i++) {
			Object o = new Object() {
				private String a = Math.random()+"aaa";
				private String b = Math.random()+"bbb";

				public String getA() {
					return a;
				}

				public void setA(String a) {
					this.a = a;
				}

				public String getB() {
					return b;
				}

				public void setB(String b) {
					this.b = b;
				}

			};
			list.add(o);
		}
		System.out.println(SimpleJson.toJSONString(list));
	}
}

分享到:
评论

相关推荐

    Json串与实体的相互转换 (不依赖于jar包 只需Eclipse环境即可)

    考虑到程序的稳定性,我花三天的时间研究json的转换,网上的代码有很多,但是都是依赖于一些写好的jar包,我导入这些jar包后都提示少东西要么就是提示错误所以我就自己手写了一个工具类,使用我的这个工具类就可以...

    nutz-1.b.52.zip

    如果你觉得 JSON 转换很麻烦(要写超过一行以上的代码),Nutz.Json 专为你设计 如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, ...

    sql-2-json:将数据从 SQL 转换为 JSON

    sql-2-json 将数据从 SQL DB 转换为 JSON 文档。设置要运行该应用程序,只需从项目根目录执行以下 cmd: $ mvn spring-boot:run 这将在同一文件夹中生成一个 json 文件。依赖关系关于一个学习新框架/技术的简单测试...

    play框架手册

    还可以从action方法签名实现转换 - 25 - 高级HTTP Java绑定 - 26 - 简单类型 - 26 - Date类型 - 26 - Calendar日历 - 27 - File - 27 - 支持类型的数组或集合 - 28 - POJO对象绑定 - 29 - JPA 对象绑定 - 30 - 定制...

    play framework 框架手册 word 版

    还可以从action方法签名实现转换 - 25 - 高级HTTP Java绑定 - 26 - 简单类型 - 26 - Date类型 - 26 - Calendar日历 - 27 - File - 27 - 支持类型的数组或集合 - 28 - POJO对象绑定 - 29 - JPA 对象绑定 - 30 - 定制...

    lamp-cloud微服务脚手架

    lamp-cloud微服务脚手架的前身是zuihou-admin-cloud,从3.0.0版本开始,改名为lamp-cloud,它是lamp项目的其中一员。 lamp-cloud微服务脚手架是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的...

    spring-tutorial-elo-rating-system-corvinus

    后端Web应用程序的服务器端组件使用Java和Spring Framework以及...结果类型也可以转换为JSON格式。由于网络性能和信息隐藏,输入和输出JSON消息应表示为Controller中的数据传输对象。控制器还负责验证输入。服务器端

    Spring.3.x企业应用开发实战(完整版).part2

    8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 ...

    Spring3.x企业应用开发实战(完整版) part1

    8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 ...

    lamp-cloud微服务脚手架-其他

    lamp-cloud的前身是zuihou-admin-cloud,从3.0.0版本开始,改名为lamp-cloud,它是lamp项目的其中一员。   lamp-cloud是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有...

    Struts2 in action中文版

    3.3.2 ActionSupport类 45 3.4 向对象传递数据 51 3.4.1 对象支持的JavaBean属性 52 3.4.2 ModelDriven动作 54 3.4.3 域对象用作数据转移的潜在危险 55 3.5 案例研究:文件上传 56 3.5.1 通过struts-default包获得内...

    Java学习笔记-个人整理的

    {4.14}数组转换为集合}{89}{section.4.14} {4.15}Map的迭代}{90}{section.4.15} {4.15.1}字符统计}{91}{subsection.4.15.1} {5}格式化输入输出}{94}{chapter.5} {5.1}时间与日期}{94}{section.5.1} {5.1.1}...

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包10

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    miaosha:基于springboot + Ajax的商品秒杀项目基础项目(前分离),涉及Springboot,Ajax,redis,mysql,Nginx以及阿里云短信发送服务

    ajax交互(json数据传输) 初步 Hibernate验证器数据校验,自定义结果封装 redis存储用户注册验证码 阿里云云市场短信服务,发送注册码 双重异常统一处理,返回格式统一 返回值封装,返回统一对象 永久层,业务层,...

    spring-rest-sample

    技术栈依赖注入:Spring 4.2.1.RELEASE REST控制器:Spring Web MVC 4.2.1.RELEASE JSON转换:Jackson 2.4.6 验证:Hibernate Validator 5.1.3.Final在本地运行要启动Web应用程序,请执行mvn这将干净地构建应用程序...

    java开源包11

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包2

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包3

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包6

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics