`

Bean、List<Bean>、Json、Map、Xml相互转换

    博客分类:
  • java
阅读更多

       系统交互中,经常会遇到各种形式的参数传递,XML、Map、Json等等,今天整理了一个涵盖各种类型转换的工具类,与大家分享分享!

    

package org.ccnu.edu.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;

/**
 * describe:bean 、 List<bean>、Map、XML、JSON 相互转换
 * 
 * @author Fei.wei
 * @since JDK 1.6 Date:2015-11-19上午9:30:36
 */
@SuppressWarnings("all")
public class ObjectConvertUtil<T> {

	/**
	 * 
	 * objectToMap:对象转换为map
	 * 
	 * @author Fei.wei
	 * @param t
	 * @return
	 * @throws IntrospectionException
	 *             类属性分析失败
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 *             调用属性的setter方法失败
	 * @since JDK 1.6 Date:2015-11-19 上午9:39:10
	 */
	public static <T> Map<String, String> objectToMap(T t)
			throws IntrospectionException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException {
		Class<? extends Object> type = t.getClass();
		Map<String, String> map = new HashMap<String, String>();
		BeanInfo beanInfo = Introspector.getBeanInfo(type);
		PropertyDescriptor[] propertyDescriptors = beanInfo
				.getPropertyDescriptors();
		for (int i = 0; i < propertyDescriptors.length; i++) {
			PropertyDescriptor descriptor = propertyDescriptors[i];
			String propertyName = descriptor.getName();
			if (!propertyName.equals("class")) {
				Method readMethod = descriptor.getReadMethod();
				// 调用get方法取值 invoke第二参数 new Object[]{} 都行,参数为空
				Object result = readMethod.invoke(beanInfo, new Object[0]);
				if (result != null) {
					map.put(propertyName, (String) result);
				} else {
					map.put(propertyName, "");
				}
			}
		}
		return map;
	}

	/**
	 * 
	 * mapToObject:map转换成对象
	 *
	 * @author Fei.wei
	 * @param type
	 * @param map
	 * @return
	 * @throws IntrospectionException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 * @since JDK 1.6 Date:2015-11-19 上午9:47:42
	 */
	public static <T> T mapToObject(Class<T> type, Map<String, String> map)
			throws IntrospectionException, InstantiationException,
			IllegalAccessException, IllegalArgumentException,
			InvocationTargetException {
		BeanInfo beanInfo = Introspector.getBeanInfo(type);
		PropertyDescriptor[] propertyDescriptors = beanInfo
				.getPropertyDescriptors();
		// 创建bean对象
		T javaBean = type.newInstance();
		for (int i = 0; i < propertyDescriptors.length; i++) {
			PropertyDescriptor descriptor = propertyDescriptors[i];
			if (map.containsKey(descriptor.getName())) {
				// 调用set方法,给属性赋值
				Method m = descriptor.getWriteMethod();
				m.invoke(javaBean,
						new Object[] { map.get(descriptor.getName()) });
			}
		}
		return javaBean;
	}
	
	/**
	 * 
	 * listToJson:List<T> 转换成 josn 
	 *
	 * @author Fei.wei
	 * @param t
	 * @return
	 * @since JDK 1.6 Date:2015-11-16 下午5:03:56
	 */
	public static<T> String listToJson(T t){
		return JSONArray.fromObject(t).toString();
	}
	
	/**
	 * 
	 * jsonToList:json 转换成 List<T> 
	 *
	 * @author Fei.wei
	 * @param json
	 * @param type
	 * @return
	 * @since JDK 1.6 Date:2015-11-16 下午5:04:39
	 */
	public static<T> List<T> jsonToList(String json,Class<T> type){
		JSONArray jsonArray = JSONArray.fromObject(json);
		ArrayList<T> list = new ArrayList<T>();
		for(Object obj : jsonArray){
			list.add(jsonToObject(obj.toString(),type));
		}
		return list;
	}
	
	/**
	 * 
	 * objectToJson:bean 转换成json 
	 *
	 * @author Fei.wei
	 * @param object
	 * @return
	 * @since JDK 1.6 Date:2015-11-10 下午3:33:21
	 */
	public static<T> String objectToJson(T t){
		return JSONObject.fromObject(t).toString();
	}
	
	/**
	 * 
	 * jsonToObject:json转换成bean
	 *
	 * @author Fei.wei
	 * @param json
	 * @param type
	 * @return
	 * @since JDK 1.6 Date:2015-11-10 下午3:33:30
	 */
	@SuppressWarnings("unchecked")
	public static<T> T jsonToObject(String json,Class<T> type){
		JSONObject jsonObject = JSONObject.fromObject(json);
		/**
		 * java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
		 * 添加JsonConfig,避免抛上面的异常
		 */
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setRootClass(type);
		return (T) JSONObject.toBean(jsonObject,jsonConfig);
	}
	

	/**
	 * 
	 * xmlToObj:xml转换成obj
	 *
	 * @author Fei.wei
	 * @param cl
	 * @param xmlString
	 * @return
	 * @throws Exception
	 * @since JDK 1.6 Date:2015-3-26 下午2:34:26
	 */
	public static<T> T xmlToObj(Class<T> cl,String xmlString) throws Exception{
		JAXBContext context = JAXBContext.newInstance(cl);
		ByteArrayInputStream stream = new ByteArrayInputStream(xmlString.getBytes("utf-8"));
		Unmarshaller um = context.createUnmarshaller();
		T p = (T) um.unmarshal(stream);
		stream.close();
		return p;
	}
	
	
	/**
	 * 
	 * objToXML:obj转换成xml 
	 *
	 * @author Fei.wei
	 * @param cl
	 * @param obj
	 * @return
	 * @throws Exception
	 * @since JDK 1.6 Date:2015-3-26 下午2:37:08
	 */
	public static<T> String objToXML(Class<T> cl,Object obj) throws Exception{
		JAXBContext context = JAXBContext.newInstance(cl);
		Marshaller m = context.createMarshaller();
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		XMLSerializer serializer = getXMLSerializer(out);
		m.marshal(obj, serializer);
		out.flush();
		String xmlString = new String(out.toByteArray(),"utf-8");
		return xmlString.substring(xmlString.indexOf("<", 2));
	}
	
	private static XMLSerializer getXMLSerializer(OutputStream out){
		OutputFormat of = new OutputFormat();
		of.setCDataElements(new String[]{"^PicUrl","^Url","ns1^foo","ns2^bar","^baz"});
		of.setPreserveSpace(true);
		of.setIndenting(true);
		XMLSerializer serializer = new XMLSerializer(of);
		serializer.setOutputByteStream(out);
		return serializer;
	}
	
	/**
	 * 
	 * objToXML:obj转xml,添加 <![CDATA[]]> 标签
	 *
	 * @author Fei.wei
	 * @param obj
	 * @return
	 * @since JDK 1.6 Date:2015-3-26 下午2:46:11
	 */
	public static String objToXML(Object obj) {
		xstream.alias("xml", obj.getClass());
		return xstream.toXML(obj);
	}

	private static XStream xstream = new XStream(new XppDriver() {

		public HierarchicalStreamWriter createWriter(Writer out) {
			return new PrettyPrintWriter(out) {

				boolean cdata = true;

				@SuppressWarnings("rawtypes")
				public void startNode(String name, Class clazz) {
					super.startNode(name, clazz);
				}

				protected void writeText(QuickWriter writer, String text) {
					if (cdata) {
						writer.write("<![CDATA[");
						writer.write(text);
						writer.write("]]>");
					} else {
						writer.write(text);
					}
				}
			};
		}
	});
}

 

分享到:
评论
1 楼 di1984HIT 2017-02-02  
      

相关推荐

    List转换为List

    List&lt;Bean&gt;转换为List&lt;Map&gt;, List&lt;Object&gt;转换为List&lt;Object&gt; list转化为 JsonArray ,list转换JsonArray

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List&lt;Map&lt;String, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List&lt;Map&lt;String, Object&gt;...

    json字符串实体bean或者List互转(gson和jackson,支持泛型)

    json字符串实体bean或者List&lt;bean&gt;互转(gson和jackson,支持泛型),支持json的格式化,所需要的包在代码也有说明。还有少的可以告知我,谢谢

    将list转换成JavaBean

    将list&lt;Map&gt;转换成JavaBean的工具类

    将list中的内容根据某一属性的值对list进行拆分

    拆分list,将list&lt;bean&gt;中的内容根据某一属性的值对list进行拆分,分组

    J2EE指南.doc

    常见问题和解决方法 31&lt;br/&gt;第3章 企业Bean 35&lt;br/&gt;1,企业Bean概述 36&lt;br/&gt;2,会话Bean 36&lt;br/&gt;3,EntityBean 38&lt;br/&gt;4,Message-Driven Bean 40&lt;br/&gt;5.定义客户端访问接口 42&lt;br/&gt;6,企业Bean的“内容” 45&lt;br/&gt;7...

    logic:iterate标签当遍历的collection为Map时的使用

    Map里存放的是List时&lt;br&gt;&lt;br&gt;&lt;logic:iterate id="destMap" name="srcMap"&gt;&lt;br&gt;&lt;br&gt; &lt;logic:iterate id="bean" name="destMap" property="value" /&gt;&lt;br&gt;&lt;br&gt; &lt;bean:write name="bean" property="name" /&gt;&lt;br&gt;&lt;br&gt; &lt;/...

    spring-xmemcached

    spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 &lt;bean name="factoryMemcachedClient" ... destroy-method="shutdown"&gt; &lt;property name="servers"&gt; &lt;value&gt;${XMemcached_servers}&lt;/value... &lt;/bean&gt;

    XML考试系统

    考试系统 &lt;br&gt;&lt;br&gt;类&lt;br&gt;Bean 类&lt;br&gt;Com.gton.bean.*&lt;br&gt;AdminBean 管理员&lt;br&gt;ResultBean 结果&lt;br&gt;TestBean 试题&lt;br&gt;TestsBean 试卷&lt;br&gt;UserBean 用户&lt;br&gt;Com.gton.bean.db.*&lt;br&gt;DataBean 数据库操作&lt;br&gt;...

    springweb-Jackson

    &lt;ref bean="mappingJacksonHttpMessageConverter" /&gt; &lt;ref bean="stringHttpMessageConverter" /&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="mappingJacksonHttpMessageConverter" class="org.springframework...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    &lt;value&gt;com/bean/Tuser.hbm.xml&lt;/value&gt; &lt;/list&gt; &lt;/property&gt; &lt;property name="hibernateProperties"&gt; &lt;props&gt; &lt;prop key="hibernate.dialect"&gt; org.hibernate.dialect.OracleDialect &lt;/...

    Java基于POI的导入导出excel功能,附带测试功能,项目基于Maven,导入即可用,带测试Main方法提供例子

    可将List&lt;Bean&gt;导出成Excel,或读取Excel成List&lt;Bean&gt;、Map&lt;String,Object&gt;,很方便,可配置日期格式,可识别数字,经过企业级测试有效. &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi&lt;/...

    05spring4_di.rar

    &lt;/bean&gt; &lt;bean id="student" class="cn.sxt.vo.Student"&gt; &lt;property name="name" value="张三丰"&gt;&lt;/property&gt; &lt;property name="addr" ref="addr"/&gt; &lt;property name="books"&gt; &lt;array&gt; &lt;value&gt;...

    Spring3.2.4+Quartz2.2.0 Demo

    &lt;ref bean="myJobTrigger" /&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 启动触发器的配置结束 --&gt; &lt;!-- 调度的配置开始 --&gt; &lt;!-- quartz-1.8以前的配置 &lt;bean id="myJobTrigger" class="org.spring...

    EJB基础

    &lt;br/&gt;&lt;br/&gt;学完本教程之后,您将会了解:&lt;br/&gt;&lt;br/&gt;整体体系结构 &lt;br/&gt;客户机和服务器的角色 &lt;br/&gt;会话和实体 Bean 的生命周期 &lt;br/&gt;学完本教程之后,您将学会:&lt;br/&gt;&lt;br/&gt;构建基于 EJB 技术的分布式系统 &lt;br/&gt;创建...

    ActiveMQ 基于IP验证和授权插件的源码及jar

    基于 IP 验证和授权插件的源码及jar,jar包可直接拷贝至activemq 目录下的 lib 目录... &lt;list&gt; &lt;value&gt;127.0.0.1&lt;/value&gt; &lt;value&gt;192.168.168.1&lt;/value&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;/plugins&gt; 后直接使用

    jdbc——内嵌事务

    &lt;bean id="departmentDao" class="my.aop.dao.DepartmentDaoJdbcImpl" scope="prototype"&gt; &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt; &lt;/bean&gt; &lt;bean id="userDao" class="my.aop.dao....

    ssh 整合的实例-----员工表的增删查改

    &lt;/bean&gt; &lt;bean id="mysessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;property name="dataSource" ref="mydataSource"&gt; &lt;/property&gt; &lt;property name=...

    spring定时任务

    &lt;bean id="sayHelloJob" class="org.springframework.scheduling.quartz.JobDetailBean"&gt; &lt;property name="jobClass"&gt; &lt;value&gt;com.test.Test&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 关键在如下两个触发器的...

    javaSSH整合

    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt; &lt;property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"&gt; &lt;/property&gt; &lt;property name="url" value="jdbc:...

Global site tag (gtag.js) - Google Analytics