json与xml互转

json与xml互转

废话不多说,直接上代码,纯手工

package com.pansky.common.util;

import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import java.util.Set;

import org.dom4j.Attribute;
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.XMLWriter;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 此类提供json与xml互转
 * @author hongji
 * @date 2018-10-29
 *
 */
public class JsonAndXmlUtil {

	/**
	 * json转xml
	 * @param json
	 * @param code
	 * @param root
	 * @return
	 */
	public static String json2Xml(String json, String root, String code) {
		//创建一个xml文档
		Document doc = DocumentHelper.createDocument();
		//向xml文件中添加注释
		doc.addComment("hongji  2018-10-29");
		//创建根节点
		Element elRoot = doc.addElement(root);
		try {
			JSONArray jsonArr = JSONArray.parseArray(json);
			jsonArr2Xml(elRoot, "e",jsonArr);
		} catch (Exception e) {
			JSONObject jsonObj = JSONObject.parseObject(json);
			//判断是否要将第一层键值对作为根标签子节点
			Set<String> keySet = jsonObj.keySet();
			int count = 0;
			for (String key : keySet) {
				if (!"-".equals(key.substring(0, 1))) {
					count++;
				}
			}
			if (count != 1) {
				jsonObj2Xml(elRoot,jsonObj);
			} else {
				jsonObjOneKey2Xml(elRoot,jsonObj);
			}
		}
		//用于格式化xml内容和设置头部标签
		OutputFormat format = OutputFormat.createPrettyPrint();
		//设置xml文档的编码格式
		format.setEncoding(code);
		StringWriter sw = new StringWriter();
		XMLWriter xmlWriter = new XMLWriter(sw, format);
		try {
			xmlWriter.write(doc);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				sw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return sw.toString();
	}
	
	/**
	 * xml字符串转换为json
	 * 默认第一个key值为根节点
	 * @param jsonObj
	 * @return
	 * @throws DocumentException 
	 */
	public static String xml2Json(String xml) throws DocumentException {
		JSONObject jsonobj = new JSONObject();
		//创建doc对象
		Document doc = DocumentHelper.parseText(xml);
		// 获取根节点
		Element root = doc.getRootElement();
		readNodes(root,jsonobj);
		return jsonobj.toString();
	}
	
	/**
	 * 对节点进行处理
	 * @param node
	 * @param jsonObject
	 */
	private static void readNodes(Element node,JSONObject jsonObject) {
		//所有一级子节点的list
		List<Element> listElement=node.elements();
		//当前节点的所有属性的list
		List<Attribute> listAttr = node.attributes();
		//结果集
		JSONObject jsonObj = new JSONObject();
		JSONArray jsonArray = new JSONArray();
		
		for (Attribute attr : listAttr) {
			jsonObj.put("-" + attr.getName(), attr.getValue());
		}
		
		if (listElement == null || listElement.isEmpty()) {	
			//无子节点则将值写入
			jsonObject.put(node.getName(), node.getTextTrim());
		}else {
			int i = 0;
			for(Element e:listElement){//遍历所有一级子节点
				int j = 0;
				boolean flag = true;
				for(Element el:listElement) {
					if (i != j && e.getName().equals(el.getName())) {
						readNodes(e, jsonArray, jsonObj);
						flag = false;
						break;
					}
					j++;
				}
				if (flag) {
					readNodes(e,jsonObj);
				}
				i++;
			}
			//赋值
			jsonObject.put(node.getName(), jsonObj);
		}
	}

	/**
	 * 对数组类型进行处理
	 * @param node
	 * @param jsonArray
	 * @param jsonObj
	 */
	private static void readNodes(Element node, JSONArray jsonArray, JSONObject jsonObj) {
		JSONObject jsonObject = new JSONObject();
		//写入属性
		List<Attribute> listAttr = node.attributes();
		for (Attribute attr : listAttr) {
			jsonObject.put("-" + attr.getName(), attr.getValue());
		}
		//所有一级子节点的list
		List<Element> listElement=node.elements();
		//遍历所有一级子节点
		for(Element e:listElement){
			readNodes(e, jsonObject);
		}
		jsonArray.add(jsonObject);
		jsonObj.put(node.getName(), jsonArray);
	}
	
	/**
	 * jsonObj仅有一个键值对
	 * @param el
	 * @param jsonObj
	 */
	private static void jsonObjOneKey2Xml(Element el, JSONObject jsonObj) {
		Set<String> keySet = jsonObj.keySet();
		for (String key : keySet) {
			if ("-".equals(key.substring(0, 1))) {
				el.addAttribute(key.substring(1), jsonObj.getString(key));
			}else {
				try {
					JSONArray jsonArray = jsonObj.getJSONArray(key);
					jsonArr2Xml(el, "e", jsonArray);
				} catch (Exception e) {
					try {
						JSONObject jsonObject = jsonObj.getJSONObject(key);
						jsonObj2Xml(el, jsonObject);
					} catch (Exception e2) {
						el.setText(jsonObj.getString(key));
					}
				}
			}
		}
	}

	/**
	 * 对jsonArr进行赋值
	 * @param el
	 * @param key
	 * @param jsonArr
	 */
	private static void jsonArr2Xml(Element el, String key, JSONArray jsonArr) {
		
		for (int i = 0; i < jsonArr.size(); i++) {
			try {
				JSONArray jsonArray = jsonArr.getJSONArray(i);
				jsonArr2Xml(el, "e", jsonArray);
			} catch (Exception e) {
				Element sonEl = el.addElement(key);
				try {
					JSONObject jsonObject = jsonArr.getJSONObject(i);
					jsonObj2Xml(sonEl, jsonObject);
				} catch (Exception e2) {
					sonEl.setText(jsonArr.getString(i));
				}
				
			}
			
		}
	}

	/**
	 * 对jsonObj进行赋值
	 * @param el
	 * @param jsonObj
	 */
	private static void jsonObj2Xml(Element el, JSONObject jsonObj) {
		Set<String> keySet = jsonObj.keySet();
		for (String key : keySet) {
			if ("-".equals(key.substring(0, 1))) {
				el.addAttribute(key.substring(1), jsonObj.getString(key));
			}else {
				
				try {
					JSONArray jsonArray = jsonObj.getJSONArray(key);
					jsonArr2Xml(el, key, jsonArray);
				} catch (Exception e) {
					Element sonEl = el.addElement(key);
					try {
						JSONObject jsonObject = jsonObj.getJSONObject(key);
						jsonObj2Xml(sonEl, jsonObject);
					} catch (Exception e2) {
						sonEl.setText(jsonObj.getString(key));
					}
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值