欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

两种方式带你玩转 json 格式转 xml 格式

程序员文章站 2022-06-02 15:50:13
...

你知道的越多,你不知道的越多
点赞再看,养成习惯
如果您有疑问或者见解,或者没有积分想获取项目,欢迎指教:
企鹅:869192208

前言

近日,在工作中遇到这么一个需求。客户希望我们能将 json 格式的字符串,转为 xml 格式返回给他们。针对这一需求,结合互联网上其他前辈的分享,摸索出两种 json 格式转 xml 格式的方法。

方法一、使用 jdom 进行转换

描述:

xml转json org.jdom
用 dom 提取节点 转成map
json 转 xml com.alibaba.fastjson.JSONObject

需要引入 jdom 1.x 版本:

		<!-- https://mvnrepository.com/artifact/org.jdom/jdom -->
		<dependency>
		    <groupId>org.jdom</groupId>
		    <artifactId>jdom</artifactId>
		    <version>1.1.3</version>
		</dependency>
package com.minstone.test;

import java.io.File;
import java.io.FileOutputStream;
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.Map.Entry;
import java.util.Set;

import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

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

public class JsonToXml {
        public static void main(String[] args) throws Exception {
            //请注意使用正常的xml
            //xml->json
//            String jsonStr = xmlToJson("D:\\NewFile.xml", null);
//            System.out.println(jsonStr);
            
            //json->xml
          String xmlstr = jsonToXml("{\"biz_content\":{\"signdata\":\"rHjD6Rc3Fgq8mPS6B48qPs/DPJnZZPN6QQJQodY3+hK6PWCF3/2oi3DJPnFEXgKDrXX5rHT7q/I0nQPAruuBbQRfErnenQNvPpbf/lXl690qtye0/ZEuDs0ByFdFAGffQalB+Ij3lLUMDPz2GfUDlolPjY2/YkBXGGPJoVPtCio=\",\"userobj\":{\"uid\":\"mayintao000\",\"realtype\":\"DC\",\"cn\":\"法人用户2\",\"tokenid\":\"\",\"usertype\":\"2\",\"link_person_name\":\"联系人2\",\"isreal\":\"true\",\"telephonenumber\":\"13*******21\",\"mail\":\"[email protected]\",\"idcardtype\":\"10\",\"createtime\":\"20150618191221\",\"extproperties\":[\"address=广东省广州市天河区天河北路371号802室\",\"legal_code=440***********033\",\"ent_type=-1\",\"link_person_code=350************14\",\"origin=gdbs\",\"card_type_two_num=-1\",\"cert_ca=-1\",\"accout_type=2\",\"account_uid=2\",\"comm_code=-1\",\"unit_type=-1\",\"legal_id_type=10\",\"landline=-1\",\"tax_code=-1\",\"cert_notafter=-1\",\"card_type_one_num=-1\",\"local_user=-1\",\"legal_person=郑奋明\",\"link_person_type=10\",\"card_type_three=-1\",\"card_type_two=-1\",\"card_type_three_num=-1\",\"cert_data=-1\",\"area=guangzhou\",\"uversion=3.0\",\"cert_notbefore=-1\",\"card_type_one=-1\",\"user_typeext=2\"],\"idcardnumber\":\"11***************23\",\"useridcode\":\"38c97fa1ee2e43d4a664cffc4554cde4\",\"creditable_level_of_account_way\":\"[email protected]@2088******653||[email protected]@44088******75||[email protected]@44088******75\",\"creditable_level_of_account\":\"L3\"},\"pareobj\":{\"uid\":\"mayintao\",\"realtype\":\"DC\",\"cn\":\"单位用户2\",\"tokenid\":\"\",\"usertype\":\"2\",\"link_person_name\":\"联系人2\",\"isreal\":\"true\",\"telephonenumber\":\"13*******21\",\"mail\":\"[email protected]\",\"idcardtype\":\"50\",\"createtime\":\"20150618191221\",\"extproperties\":[\"address=广东省广州市东山区\",\"legal_id_type=-1\",\"link_person_type=-1\",\"legal_code=-1\",\"origin=gdbs\",\"tax_code=-1\",\"legal_person=-1\",\"area=shenzhen\",\"link_person_code=-1\",\"user_typeext=2\",\"uversion=1.0\"],\"idcardnumber\":\"456787654\",\"useridcode\":\"75c91fagrr2e67d4a169cfmc8735ctrf\",\"creditable_level_of_account_way\":\"[email protected]@2088******653||[email protected]@44088******75||[email protected]@44088******75\",\"creditable_level_of_account\":\"L3\"},\"user_creditable_level\":{\"creditable_level_of_account_way\":\"[email protected]@2088******653||[email protected]@44088******75||[email protected]@44088******75\",\"creditable_level_of_account_way_list\":[{\"auth_time\":\"2018-02-28 16:45:26\",\"uniqueid\":\"106a50e64764486f93fb612122a1a7ae\",\"user_name\":\"郭**\",\"auth_identification\":\"2088******653\",\"identity_level\":\"L2\",\"credential_no\":\"44088******75\",\"way_code\":\"YSS\"},{\"auth_time\":null,\"uniqueid\":\"106a50e64764486f93fb612122a1a7ae\",\"user_name\":\"郭**\",\"auth_identification\":\"44088******75\",\"identity_level\":\"L0\",\"credential_no\":\"44088******75\",\"way_code\":\"IDV\"},{\"auth_time\":\"2018-02-13 17:12:31\",\"uniqueid\":\"106a50e64764486f93fb612122a1a7ae\",\"user_name\":\"郭**\",\"auth_identification\":\"44088******75\",\"identity_level\":\"L3\",\"credential_no\":\"44088******75\",\"way_code\":\"GW\"}],\"creditable_level_of_account\":\"L3\"}},\"time_stamp\":\"20200821\",\"version \":\"v1\",\"sign\":\"MEYCIQC3xjKlksBVwrxf0MFT7eQqYgYKWtgzNBi6mhS2tbqkPgIhAOfQnz4lG5JWMNhGw5v7CicfBAexD85PbYoevDyRA8hv \"}");
          System.out.println(xmlstr);
          createXMLFile(formatXML(xmlstr), "测试");
        }
        
        /**
         * xml转json字符串 注意:路径和字符串二传一另外一个传null<br>
         * 方 法 名:xmlToJson <br>
         * @param xmlPath xml路径(和字符串二传一,两样都传优先使用路径)
         * @param xmlStr xml字符串(和路径二传一,两样都传优先使用路径)
         * @return String
         * @throws IOException 
         * @throws JDOMException 
         */
        @SuppressWarnings("unchecked")
        public static String xmlToJson(String xmlPath,String xmlStr){
            SAXBuilder sbder = new SAXBuilder();
            Map<String, Object> map = new HashMap<String, Object>();
            Document document;
            try {
                if(xmlPath!=null){
                    //路径
                    document = sbder.build(new File(xmlPath));
                }else if(xmlStr!=null){
                    //xml字符
                    StringReader reader = new StringReader(xmlStr);
                    InputSource ins = new InputSource(reader);
                    document = sbder.build(ins);
                }else{
                    return "{}";
                }
                //获取根节点
                Element el =  document.getRootElement();
                List<Element> eList =  el.getChildren();
                Map<String, Object> rootMap = new HashMap<String, Object>();
                //得到递归组装的map
                rootMap = xmlToMap(eList,rootMap);
                map.put(el.getName(), rootMap);
                //将map转换为json 返回
                return JSON.toJSONString(map);
            } catch (Exception e) {
                return "{}";
            }
        }
        /**
         * json转xml<br>
         * 方 法 名:jsonToXml <br>
         * @param json
         * @return String
         */
        public static String jsonToXml(String json){
            try {
                StringBuffer buffer = new StringBuffer();
                buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
                buffer.append("<base>");
                JSONObject jObj = JSON.parseObject(json);
                jsonToXmlstr(jObj,buffer);
                buffer.append("</base>");
                return buffer.toString();
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
        /**
         * json转str<br>
         * 方 法 名:jsonToXmlstr <br>
         * @param jObj
         * @param buffer
         * @return String
         */
        public static String jsonToXmlstr(JSONObject jObj,StringBuffer buffer ){
            Set<Entry<String, Object>>  se = jObj.entrySet();
            for( Iterator<Entry<String, Object>>   it = se.iterator();  it.hasNext(); )
          {             
              Entry<String, Object> en = it.next();
              if(en.getValue() != null && en.getValue().getClass().getName().equals("com.alibaba.fastjson.JSONObject")){
                  buffer.append("<"+en.getKey()+">");
                      JSONObject jo = jObj.getJSONObject(en.getKey());
                      jsonToXmlstr(jo,buffer);
                  buffer.append("</"+en.getKey()+">");
              }else if(en.getValue() != null && en.getValue().getClass().getName().equals("com.alibaba.fastjson.JSONArray")){
                  if (en.getKey().equals("extproperties")) {
                      JSONArray ja = jObj.getJSONArray(en.getKey());
                      Iterator<Object> it1 = ja.iterator();
                      List<String> list=new ArrayList<String>();
                      while (it1.hasNext()) {
                          String ob = (String) it1.next();            
                          System.out.println(ob);          
                      }
                }else {
                    JSONArray jarray = jObj.getJSONArray(en.getKey());
                    for (int i = 0; i < jarray.size(); i++) {
                        buffer.append("<"+en.getKey()+">");
                            JSONObject jsonobject =  jarray.getJSONObject(i);
                            jsonToXmlstr(jsonobject,buffer);
                        buffer.append("</"+en.getKey()+">");    
                    }
                }
                  
              }else if(en.getValue() != null && en.getValue().getClass().getName().equals("java.lang.String")){
                  buffer.append("<"+en.getKey()+">"+en.getValue());
                  buffer.append("</"+en.getKey()+">");
              }else{
                  buffer.append("<"+en.getKey()+">"+"");
                  buffer.append("</"+en.getKey()+">");
              }
              
          }
            return buffer.toString();
        }
        
        
        /**
         * 节点转map<br>
         * 方 法 名:xmlToMap <br>
         * @param eList
         * @param map
         * @return Map<String,Object>
         */
        @SuppressWarnings("unchecked")
        public static Map<String, Object> xmlToMap(List<Element> eList,Map<String, Object> map){
            for (Element e : eList) {
                Map<String, Object> eMap = new HashMap<String, Object>();
                List<Element> elementList = e.getChildren();
                if(elementList!=null&&elementList.size()>0){
                    eMap = xmlToMap(elementList,eMap);
                    Object obj = map.get(e.getName());
                    if(obj!=null){
                        List<Object> olist = new ArrayList<Object>();
                        if(obj.getClass().getName().equals("java.util.HashMap")){
                            olist.add(obj);
                            olist.add(eMap);
                            
                        }else if(obj.getClass().getName().equals("java.util.ArrayList")){
                            olist = (List<Object>)obj;
                            olist.add(eMap);
                        }
                        map.put(e.getName(), olist);
                    }else{
                        map.put(e.getName(), eMap);
                    }
                }else{
                    map.put(e.getName(), e.getValue());
                }
            }
            return map;
        }
        
        
        /**
         * 将已经格式化的xml字符串写入xml文件
         * @param xmlStr
         * @return
         */
        public static boolean createXMLFile(String xmlStr,String xmlName){
            boolean flag = false;
            try {
                XMLWriter output = null;
                //OutputFormat   format   =   OutputFormat.createPrettyPrint(); 
                //format.setSuppressDeclaration(true);
               // format.setEncoding("UTF-8");

                //如果上面设置的xml编码类型为GBK,则应当用FileWriter来构建xml文件,否则会出现中文连码问题
                /*outpt = new XMLWriter(
                        new FileWriter( 
                                new File("D:/myeclipse/Workspaces/fusionChartsDemoTest/WebRoot/xml/"+xmlName+".xml")) ,
                                    format);
                  */

                //如果上面设置的xml编码类型为utf-8,则应当用FileOutputStream来构建xml文件,否则还是会出现问题
                output = new XMLWriter(
                        new FileOutputStream( 
                                new File("D:/"+xmlName+".xml")));
                output.setEscapeText(false);
                output.write( xmlStr );
                output.close();
                return flag = true;

            } catch (IOException e) {
                e.printStackTrace();
                return flag;
            }

        }
        
        public static  String formatXML(String str) throws Exception {  

            SAXReader reader=new SAXReader();

            //创建一个串的字符输入流
            StringReader in=new StringReader(str);
            org.dom4j.Document doc=reader.read(in);
           // 创建输出格式
            OutputFormat formater=OutputFormat.createPrettyPrint();
            //去掉xml文件的版本信息
            //formater.setSuppressDeclaration(true);
            //设置xml的输出编码
            formater.setEncoding("UTF-8");
            //创建输出(目标)
            StringWriter out=new StringWriter();
           //创建输出流
            XMLWriter writer=new XMLWriter(out,formater);
             //输出格式化的串到目标中,执行后。格式化后的串保存在out中。
            writer.write(doc);

            writer.close();

           // System.out.println(out.toString());

           //返回我们格式化后的结果
            return out.toString();     
        }
}

方法二、使用 dom4j 进行转换

描述:

使用 dom4j 和
com.google.gson.*

需要引入 dom4j 1.6.1 版本和 gson:

		<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
		<dependency>
		    <groupId>dom4j</groupId>
		    <artifactId>dom4j</artifactId>
		    <version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.2.4</version>
		</dependency>
package com.minstone.test;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map.Entry;
import java.util.Set;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import com.google.gson.*;

public class JsonToXml2 {
        private static final String STR_JSON = "{\"stakeapply\":{\"voltageLevel\":\"AC00062\",\"stakeList\":{\"stake\":[{\"stakeAssetNO\":45754745,\"otherStakeTypeRemark\":\"xxx\",\"stationId\":\"547547547547\"},{\"stakeAssetNO\":34325325322,\"otherStakeTypeRemark\":\"xxx\",\"stationId\":\"52354645462\"}]},\"otherStationTypeRemark\":\"xxx\",\"stationAddr\":\"哈哈\",\"custLists\":{\"custList\":{\"custId\":\"7547547547\",\"custPhone\":13666666666,\"contactMode\":1}},\"principalList\":{\"principal\":[{\"principalName\":121212,\"principalType\":1},{\"principalName\":12121233,\"principalType\":1}]}}}";

        /**
         * 将json字符串转换成xml
         * 
         * @param json
         *            json字符串
         * @param parentElement
         *            xml根节点
         * @throws Exception
         */
        public static Element jsonToXml(String json, Element parentElement) throws Exception {
            JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
            Element ee = toXml(jsonObject, parentElement, null);
            return ee;
        }

        /**
         * 将json字符串转换成xml
         * 
         * @param jsonElement
         *            待解析json对象元素
         * @param parentElement
         *            上一层xml的dom对象
         * @param name
         *            父节点
         */
        public static Element toXml(JsonElement jsonElement, Element parentElement, String name) {
            if (jsonElement instanceof JsonArray) {
                //是json数据,需继续解析
                JsonArray sonJsonArray = (JsonArray)jsonElement;
                for (int i = 0; i < sonJsonArray.size(); i++) {
                    JsonElement arrayElement = sonJsonArray.get(i);
                    toXml(arrayElement, parentElement, name);
                }
            }else if (jsonElement instanceof JsonObject) {
                //说明是一个json对象字符串,需要继续解析
                JsonObject sonJsonObject = (JsonObject) jsonElement;
                Element currentElement = null;
                if (name != null) {
                    currentElement = parentElement.addElement(name);
                }
                Set<Entry<String, JsonElement>> set = sonJsonObject.entrySet();
                for (Entry<String, JsonElement> s : set) {
                    toXml(s.getValue(), currentElement != null ? currentElement : parentElement, s.getKey());
                }
            } else {
                //说明是一个键值对的key,可以作为节点插入了
                addAttribute(parentElement, name, jsonElement.getAsString());
            }
            return parentElement;
        }

        /**
         * 
         * @param element   父节点
         * @param name      子节点的名字
         * @param value     子节点的值
         */
        public static void addAttribute(Element element, String name, String value) {
            //增加子节点,并为子节点赋值
            Element el = element.addElement(name);
            el.addText(value);
            
        }
        public static void main(String[] args) throws Exception {

            Document document = DocumentHelper.createDocument();
            Element root =  document.addElement("stakeapply"); //默认根节点
            Element el = jsonToXml(STR_JSON, root);
            System.out.println(el.asXML());
            try {
                //生成xml文件
                String fileName = "test.xml";
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("UTF-8"); // 指定XML编码
                format.setExpandEmptyElements(true);//自动添加闭合标签
                document.setXMLEncoding("UTF-8");
                //指定文件路径,名字,格式
                XMLWriter writer = new XMLWriter(
                        new FileOutputStream(new File("D:" + File.separator + fileName)), format);
                writer.write(document);
                writer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    /*
    json串
    {
        "stakeapply": {
            "voltageLevel": "AC00062", 
            "stakeList": {
                "stake": [
                    {
                        "stakeAssetNO": 45754745, 
                        "otherStakeTypeRemark": "xxx", 
                        "stationId": "547547547547"
                    }, 
                    {
                        "stakeAssetNO": 34325325322, 
                        "otherStakeTypeRemark": "xxx", 
                        "stationId": "52354645462"
                    }
                ]
            }, 
            "otherStationTypeRemark": "xxx", 
            "stationAddr": "哈哈", 
            "custLists": {
                "custList": {
                    "custId": "7547547547", 
                    "custPhone": 13666666666, 
                    "contactMode": 1
                }
            }, 
            "principalList": {
                "principal": [
                    {
                        "principalName": 121212, 
                        "principalType": 1
                    }, 
                    {
                        "principalName": 12121233, 
                        "principalType": 1
                    }
                ]
            }
        }
    }
    */

    /*
    转换后的xml
    <?xml version="1.0" encoding="UTF-8"?>

    <stakeapply>
      <voltageLevel>AC00062</voltageLevel>
      <stakeList>
        <stake>
          <stakeAssetNO>45754745</stakeAssetNO>
          <otherStakeTypeRemark>xxx</otherStakeTypeRemark>
          <stationId>547547547547</stationId>
        </stake>
        <stake>
          <stakeAssetNO>34325325322</stakeAssetNO>
          <otherStakeTypeRemark>xxx</otherStakeTypeRemark>
          <stationId>52354645462</stationId>
        </stake>
      </stakeList>
      <otherStationTypeRemark>xxx</otherStationTypeRemark>
      <stationAddr>哈哈</stationAddr>
      <custLists>
        <custList>
          <custId>7547547547</custId>
          <custPhone>13666666666</custPhone>
          <contactMode>1</contactMode>
        </custList>
      </custLists>
      <principalList>
        <principal>
          <principalName>121212</principalName>
          <principalType>1</principalType>
        </principal>
        <principal>
          <principalName>12121233</principalName>
          <principalType>1</principalType>
        </principal>
      </principalList>
    </stakeapply>
    */
}