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));
}
}
}
}
}
}