论坛首页 Java企业应用论坛

发两个工具类,JavaBean转换JSON和XML

浏览 4390 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-05   最后修改:2011-08-05
就两个工具类而已,实际中应该比较实用。Json就不说了,xml主要是有类似java跟flash交互的情况下就会用的着。Json的是网上找的,Xml的是自己写的。JSON转换apache官网有个工具包,但是就为了这么个小功能去下几个工具包感觉有点浪费,而且有很多依赖包。
这里贴一下XmlHelper的代码吧。

package com.caedmon.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class XmlHelper {
	private String filename;
	private Document document;
	static Logger logger=Logger.getLogger(XmlHelper.class);
	/**
	 * 路径的包含的xml文件只需要有根节点就可,否则不是合法的xml文件无法解析
	 * */
	public XmlHelper(String filename){
		this.filename=filename;
    	SAXReader reader = new SAXReader();
    	File file = new File(filename);
    	InputStream is=null;
    	try {
    		is = new FileInputStream(file);
    		this.document=reader.read(is);
    	} catch (FileNotFoundException e) {
    		logger.info("未找到"+filename+"这个文件");
    	} catch (DocumentException e) {
    		logger.error(e);
		}
	}
	/**
	 * 清除原来根节点中的内容,如果保存之前不清楚的话,是在文档后追加,而不是重新写入
	 */
	public void clear(){
		document.getRootElement().clearContent();
	}
	/**
	 * 保存xml到指定路径
	 * */
    public void save(String filename) throws IOException{
    	//此处最好不要用FileWriter,会出现中文乱码
    	XMLWriter out = new XMLWriter(new FileOutputStream(this.filename));
    	out.write(document);
    	out.flush();
    	out.close();
  	}
    public XPath getXPath(Element element, String nsUrl, String nsName, String selectUrl){
    	Map nsMap = new HashMap();
    	nsMap.put(nsName, nsUrl);
    	XPath xPath = element.createXPath(selectUrl);
    	xPath.setNamespaceURIs(nsMap);
    	return xPath;
  }
  	public void save() throws IOException{
  	  save(this.filename);
    }
  	/**
  	 * 将指定对象转成xml表达的字符串
  	 * */
	public String format(Object object){
		Element element=document.getRootElement();
		try{
			if(
					object instanceof Integer||
					object instanceof Double||
					object instanceof String||
					object instanceof Character||
					object instanceof Byte||
					object instanceof Long||
					object instanceof Float||
					object instanceof Short
				){
					throw new IllegalArgumentException();
				}else if(object instanceof List<?>){
					insertList(element, (List<?>)object);
				}else if(object instanceof Map<?, ?>){
					insertMap(element, (Map<?,?>)object);
				}else if(object instanceof Set<?>){
					insertSet(element, (Set<?>)object);
				}else if(object instanceof Object[]){
					insertArray(element, (Object[])object);
				}else {
					insertObject(element,object);
				}
		}catch(IllegalAccessException e1){
			e1.printStackTrace();
		}catch(IllegalArgumentException e2){
			e2.printStackTrace();
		}
		return document.asXML();
	}
	public static Element insertObject(Element element,Object object) throws IllegalArgumentException, IllegalAccessException{
		if(object!=null){
			Class<?> clazz=object.getClass();
			//类节点的名字
			String classEName=toLowerHead(clazz.getSimpleName());
			Field[] fields=clazz.getDeclaredFields();
			Element classElement=element.addElement(classEName);
			for(Field field:fields){
				String name=field.getName();
				field.setAccessible(true);
				Object fieldObj=field.get(object);
				if(fieldObj==null){
					classElement.addAttribute(name, "");
				}else if(
					fieldObj instanceof Integer||
					fieldObj instanceof Double||
					fieldObj instanceof String||
					fieldObj instanceof Character||
					fieldObj instanceof Byte||
					fieldObj instanceof Long||
					fieldObj instanceof Float||
					fieldObj instanceof Short
				){
					String value=field.get(object).toString();
					classElement.addAttribute(name, value);
				}else if(fieldObj instanceof Date){
					Date date=(Date)fieldObj;
					SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					String value=format.format(date);
					classElement.addAttribute(name, value);
				}else{
					Element child=classElement.addElement(name);
					if(fieldObj instanceof List<?>){
						insertList(child, (List<?>)fieldObj);
					}else if(fieldObj instanceof Map<?, ?>){
						insertMap(child, (Map<?,?>)fieldObj);
					}else if(fieldObj instanceof Set<?>){
						insertSet(child, (Set<?>)fieldObj);
					}else if(fieldObj instanceof Object[]){
						insertArray(child, (Object[])fieldObj);
					}else {
						insertObject(child,fieldObj);
					}
				}
			}
		}
		return element;
	}
	public static Element insertList(Element element,List<?> list) throws IllegalArgumentException, IllegalAccessException {
		for(Object object:list){
			insertObject(element, object);
		}
		return element;
	}
	public static Element insertMap(Element element,Map<?, ?> map) throws IllegalArgumentException, IllegalAccessException{
		Iterator<?> iterator=map.values().iterator();
		while(iterator.hasNext()){
			Object object=iterator.next();
			insertObject(element, object);
		}
		return element;
	}
	public static Element insertSet(Element element,Set<?> set) throws IllegalArgumentException, IllegalAccessException{
		Iterator<?> iterator=set.iterator();
		while(iterator.hasNext()){
			Object object=iterator.next();
			insertObject(element, object);
		}
		return element;
	}
	public static Element insertArray(Element element,Object[] array) throws IllegalArgumentException, IllegalAccessException {
		for(Object obj:array){
			insertObject(element, obj);
		}
		return element;
	}
	public static String toLowerHead(String simpleName){
		String begin=simpleName.substring(0,1).toLowerCase();
		String other=simpleName.substring(1,simpleName.length());
		return begin+other;
	}
}


有什么问题的话可以提出来,我也是才写出来没多久,可能会有问题的。。如果哪里不懂的话也可以问下,毕竟注释比较少。。
PS:东西比较简单,高抬贵手,别投隐藏,新手。。 就是让大家以后省点功夫。。
忘了提醒大家,Xml的是依赖Dom4j的。。
   发表时间:2011-08-05  
json可以看下fastjson感觉效率还是不错的,xml就用jaxb吧
0 请登录后投票
   发表时间:2011-08-07  
这些都简单 麻烦的是 使用hibernate后的延迟加载问题 比如 一个Bean中有一个延迟加载的对象User,在转换的时候怎么办。
常见到的如使用jquery easyui时列表绑定的json数据延迟加载问题。
解决方法稍后我会贴在博客中。
0 请登录后投票
   发表时间:2011-08-07  
XML处理习惯用xstream,基本功能都能够支持。
只是不知道LZ的这个效率怎样
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics