利用反射机制获取类的信息,然后将所得的信息,转化成JSON数据,方便传输或者生产xml文件
下面是我的实现方法,办法有点笨,欢迎指正,就是生产xml文件的是很,不知道怎么样修改配置信息,比如
<property name=" " /> 我这里生成的都是mxlls之类的信息,不知道怎么需要改,先放着再说,遇到解决的是很在回来修改。
package com.lzb.common;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*
* 功能描述:Java POJO转换成JSON字符串,或者XML
*
* @author lizhenbin
*
* <p>修改历史:(修改人,修改时间,修改原因/内容)</p>
*/
public class EntityChanageXmlJson {
private static final String SPLIT_STR = ":";
private static final String KV_STR = ",";
private static final String JSON_LEFT = "{";
private static final String JSON_RIGHT = "}";
private static final String SPLIT = "\"";
private static final String PROP_SPLIT = ";";
private static final String XML_FIELD = "field";
private static final String XML_PROPERTY = "property";
private static final String XML_VALUE = "value";
private static EntityChanageXmlJson instance = null;
public EntityChanageXmlJson() {};
public static synchronized EntityChanageXmlJson getInstance() {
if(instance==null)
instance = new EntityChanageXmlJson();
return instance;
}
/**
*
* 功能描述:将POJO的转化成json字符串形式, POJO的属性只可以是public的简单属性
*
* @author lizhenbin
* <p>创建日期 :May 7, 2012 12:38:31 PM</p>
*
* @param obj 转成为json的POJO对象
* @return
*
* <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
*/
public static String pojoToJson(Object obj) {
if(obj==null) {
return null;
}
Map<Map<String,Object>,String> clazzmap = new HashMap<Map<String, Object>, String>();
/**
* Java的反射机制获取类的信息
*/
Class clazz = obj.getClass();
Field[] fields = clazz.getFields();
/**
* 将Class的值放到map
*/
for(Field f : fields) {
String key = f.getName();
String type = f.getType().getSimpleName();
Object value = null;
try {
value = f.get(obj);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Map<String, Object> kvmap = new HashMap<String, Object>();
kvmap.put(key, value);
clazzmap.put(kvmap, type);
}
/**
* 构建json格式
*/
if(clazzmap!=null) {
String json = null;
StringBuilder sb = new StringBuilder();
sb.append(JSON_LEFT);
Set<Map<String, Object>> keySet = clazzmap.keySet();
for(Map<String, Object> skey : keySet) {
Set<String> kvSet = skey.keySet();
for(String s : kvSet) {
sb.append(SPLIT + s + SPLIT);
sb.append(KV_STR);
sb.append(SPLIT + skey.get(s) + SPLIT + SPLIT_STR);
// 根据需求可以返回类型
// sb.append(SPLIT + clazzmap.get(skey) + SPLIT + PROP_SPLIT);
}
}
sb.deleteCharAt(sb.toString().length()-1);
sb.append(JSON_RIGHT);
return sb.toString();
}
return null;
}
/**
*
* 功能描述: 将简单的POJO转为xml形式
*
* @author lizhenbin
* <p>创建日期 :May 8, 2012 6:30:16 PM</p>
*
* @param obj 转成为xml的POJO对象
* @param path 生成xml存放的位置
*
* <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
*/
public static boolean pojoToXml(Object obj, String path) {
Map<Map<String,Object>,String> clazzmap = new HashMap<Map<String, Object>, String>();
Class clazz = obj.getClass();
Field[] fields = clazz.getFields();
Object value = null;
for(Field f : fields) {
String key = f.getName();
try {
value = f.get(obj);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Map<String, Object> kvmap = new HashMap<String, Object>();
kvmap.put(key, value);
String type = f.getType().getName();
clazzmap.put(kvmap, type);
}
/**
* 生成xml
*/
try {
/**
* 初始化,使用dom生成xml,类的属性
*/
Document doc = null;
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfactory.newDocumentBuilder();;
doc = docBuilder.newDocument();
/**
* 创建XML的根节点(根),XML的根节点
*/
Element root = doc.createElementNS(clazz.getName(), clazz.getSimpleName());
doc.appendChild(root);
Element field = doc.createElementNS(XML_FIELD, XML_PROPERTY);
root.appendChild(field);
Set<Map<String,Object>> keySetMap = clazzmap.keySet();
for(Map<String,Object> smap : keySetMap) {
Set<String> keySet = smap.keySet();
for(String s : keySet) {
Element property = doc.createElementNS(s, XML_PROPERTY);
field.appendChild(property);
Element _child = doc.createElementNS(clazzmap.get(smap), XML_VALUE);
_child.appendChild(doc.createTextNode(String.valueOf(smap.get(s))));
property.appendChild(_child);
}
}
/**
* 结束拼凑XML,输出xml
*/
TransformerFactory tff = TransformerFactory.newInstance();
Transformer transformer = tff.newTransformer();
File file = new File(path);
FileOutputStream out = new FileOutputStream(file);
StreamResult xmlResult = new StreamResult(out);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(doc), xmlResult);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}