直接贴代码
JOSN,XML,MAP相互转换
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import net.sf.json.JSONObject;
/**
*
* 提供Map<String,Object>转XML,XML转Map<String,Object>
* Map<String,Object>转Json,Json转Map<String,Object>
* XML转Json,Json转XML
*
* @author MOSHUNWEI
* @since 2018-03-09
* @version 5.0
*/
public class JXMUtils {
/**
*
* 通过Map创建XML,Map可以多层转换获一层转换
*
* @param params
* @return String-->XML
*/
public static String createXmlByMap(String parentName,Map<String, Object> params,boolean isFormXml){
Document doc = DocumentHelper.createDocument();
doc.addElement(parentName);
String xml = iteratorXml(doc.getRootElement(),parentName,params,false);
if(isFormXml){
return formatXML(xml);
}else{
return xml;
}
}
/**
*
* 通过Map创建XML,Map可以多层转换获一层转换text格式有DATA
*
* @param params
* @return String-->XML
*/
public static String createXmlByMap(String parentName,Map<String, Object> params,boolean isCDATA,boolean isFormXml){
Document doc = DocumentHelper.createDocument();
doc.addElement(parentName);
String xml = iteratorXml(doc.getRootElement(),parentName,params,isCDATA);
if(isFormXml){
return formatXML(xml);
}else{
return xml;
}
}
/**
*
* MapToXml循环遍历创建xml节点
*
* @param element 根节点
* @param parentName 子节点名字
* @param params map数据
* @return String-->Xml
*/
@SuppressWarnings("unchecked")
private static String iteratorXml(Element element,String parentName,Map<String,Object> params,boolean isCDATA) {
Element e = element.addElement(parentName);
Set<String> set = params.keySet();
for (Iterator<String> it = set.iterator(); it.hasNext();) {
String key = (String) it.next();
if(params.get(key) instanceof Map) {
iteratorXml(e,key,(Map<String,Object>)params.get(key),isCDATA);
}else if(params.get(key) instanceof List){
List<Map<String,Object>> list = (List<Map<String, Object>>) params.get(key);
for(Map<String,Object> en : list){
iteratorXml(e, key, en, isCDATA);
}
}else {
String value = params.get(key)==null?"":params.get(key).toString();
if(!isCDATA) {
e.addElement(key).addText(value);
}else {
e.addElement(key).addCDATA(value);
}
}
}
return e.asXML();
}
/**
* 格式化xml,显示为容易看的XML格式
*
* @param inputXML
* @return
*/
public static String formatXML(String inputXML){
Document document = null;
try {
SAXReader reader = new SAXReader();
document = reader.read(new StringReader(inputXML));
return formatXML(document);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 格式化document,显示为容易看的XML格式
*
* @param inputXML
* @return
*/
public static String formatXML(Document document){
String requestXML = null;
XMLWriter writer = null;
try {
if (document != null) {
StringWriter stringWriter = new StringWriter();
OutputFormat format = new OutputFormat(" ");
format.setEncoding("UTF-8");
format.setIndent(true);
format.setSuppressDeclaration(false); //不生成xml命名空间
format.setNewLineAfterDeclaration(false);
format.setNewlines(true);
writer = new XMLWriter(stringWriter, format);
writer.write(document);
writer.flush();
requestXML = stringWriter.getBuffer().toString();
}
return requestXML;
} catch (Exception e1) {
e1.printStackTrace();
return null;
}finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
}
}
}
}
/**
* 去掉空间命名的xml
*
* @param inputXML
* @return
*/
public static String formatXMLNotHead(String inputXML){
return inputXML.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", "");
}
/**
*
* 通过XML转换为Map<String,Object>
*
* @param xml 为String类型的Xml
* @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map
*/
public static Map<String, Object> createMapByXml(String xml) {
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
} catch (DocumentException e) {
e.printStackTrace();
}
return createMapByDocument(doc);
}
/**
*
* 通过document转换为Map<String,Object>
*
* @return
*/
public static Map<String, Object> createMapByDocument(Document doc) {
Map<String, Object> map = new HashMap<String, Object>();
if (doc == null)
return map;
Element rootElement = doc.getRootElement();
elementTomap(rootElement,map);
return map;
}
/***
*
* XmlToMap核心方法,里面有递归调用
*
* @param map
* @param ele
*/
@SuppressWarnings("unchecked")
private static Map<String, Object> elementTomap (Element outele,Map<String,Object> outmap) {
List<Element> list = outele.elements();
int size = list.size();
if(size == 0){
outmap.put(outele.getName(), outele.getTextTrim());
}else{
Map<String, Object> innermap = new HashMap<String, Object>();
for(Element ele1 : list){
String eleName = ele1.getName();
Object obj = innermap.get(eleName);
if(obj == null){
elementTomap(ele1,innermap);
}else{
if(obj instanceof java.util.Map){
List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
list1.add((Map<String, Object>) innermap.remove(eleName));
elementTomap(ele1,innermap);
list1.add((Map<String, Object>) innermap.remove(eleName));
innermap.put(eleName, list1);
}else{
elementTomap(ele1,innermap);
((List<Map<String, Object>>)obj).add(innermap);
}
}
}
outmap.put(outele.getName(), innermap);
}
return outmap;
}
/**
* 返回格式化JSON字符串。
*
* @param json 未格式化的JSON字符串。
* @return 格式化的JSON字符串。
*/
public static String formatJson(String json){
StringBuffer result = new StringBuffer();
int length = json.length();
int number = 0;
char key = 0;
for (int i = 0; i < length; i++){
key = json.charAt(i);
if((key == '[') || (key == '{') ){
if((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
result.append('\n');
result.append(indent(number));
}
result.append(key);
result.append('\n');
number++;
result.append(indent(number));
continue;
}
if((key == ']') || (key == '}') ){
result.append('\n');
number--;
result.append(indent(number));
result.append(key);
if(((i + 1) < length) && (json.charAt(i + 1) != ',')){
result.append('\n');
}
continue;
}
if((key == ',')){
result.append(key);
result.append('\n');
result.append(indent(number));
continue;
}
result.append(key);
}
return result.toString();
}
/**
* 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
*
* @param number 缩进次数。
* @return 指定缩进次数的字符串。
*/
private static String indent(int number){
StringBuffer result = new StringBuffer();
for(int i = 0; i < number; i++){
result.append(" ");
}
return result.toString();
}
/**
* map转为json
* @param map
* @return
*/
public static String mapToJson(Map<String,Object> map,boolean isFormJson){
String json = JSONObject.fromObject(map).toString();
if(isFormJson){
return formatJson(json);
}else{
return json;
}
}
/**
* json转为map
* @param json
* @return
*/
public static Map<String,Object> jsonToMap(String json){
@SuppressWarnings("unchecked")
Map<String,Object> map = new HashMap<>(JSONObject.fromObject(json));
return map;
}
/**
* map转xml
* @param json
* @return
*/
public static String jsonToXml(String json,boolean isFormXml){
Map<String, Object> map = jsonToMap(json);
return createXmlByMap("Document", map,isFormXml);
}
/**
* xml转map
* @param xml
* @return
*/
public static String xmlToJson(String xml,boolean isFormJson){
Map<String, Object> map = createMapByXml(xml);
return mapToJson(map,isFormJson);
}
}
MAP和Bean转换
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class BeanUtils {
protected final static Log logger = LogFactory.getLog(BeanUtils.class.getClass());
public static Map<String,Object> transMap2Bean(Object obj){
Map<String,Object> map = new HashMap<String,Object>();
try{
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor property: descriptors){
String key = property.getName();
if (!key.equals("class")) {
// 得到property对应的getter方法
Method getter = property.getReadMethod();
Object value = getter.invoke(obj);
map.put(key, value);
}
}
}catch (Exception e) {
logger.info("bean转map失败!");
}
return map;
}
public static <T extends Object> T transMap2Bean(Map<String,Object> map,Class<T> clazz){
T instance = null;
try{
instance = clazz.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : descriptors) {
String key=property.getName();
if(map.containsKey(key)){
Object value = map.get(key);
Method setter = property.getWriteMethod();
setter.invoke(instance, value);
}
}
}catch (Exception e) {
logger.info("map转bean失败!");
}
return instance;
}