废话不多说,直接上代码,纯手工
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)); } } } } } }