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

你知道的越多,你不知道的越多
点赞再看,养成习惯
如果您有疑问或者见解,或者没有积分想获取项目,欢迎指教:
企鹅: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.xymy.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("{\"b_content\":{\"sdata\":\"Ps/DPJnZZPN6QQJQodY3+hK6PWCF3/2oi3DJPnFEXgKDrXX5rHT7q/I0nQPAruuBbQRfErnenQNvPpbf/lXl690qtye0/ZEuDs0ByFdFAGffQalB+Ij3lLUMDPz=\",\"userobj\":{\"uid\":\"ma000\",\"realtype\":\"DC\",\"cn\":\"法人用户2\",\"tokenid\":\"\",\"usertype\":\"2\",\"link_person_name\":\"联系人2\",\"isreal\":\"true\",\"telephonenumber\":\"13*******21\",\"mail\":\"ceshi@123.com\",\"idcardtype\":\"10\",\"createtime\":\"20150618191221\",\"extproperties\":[\"address=广东省广州市天河区天河北路XXX号\",\"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\":\"L2@YSS@2088******653||L0@IDV@44088******75||L3@GW@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\":\"ceshi@123.com\",\"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\":\"L2@YSS@2088******653||L0@IDV@44088******75||L3@GW@44088******75\",\"creditable_level_of_account\":\"L3\"},\"user_creditable_level\":{\"creditable_level_of_account_way\":\"L2@YSS@2088******653||L0@IDV@44088******75||L3@GW@44088******75\",\"creditable_level_of_account_way_list\":[{\"auth_time\":\"2018-02-28 16:45:26\",\"uniqueid\":\"***86f93fb61***\",\"user_name\":\"郭**\",\"auth_identification\":\"2088******653\",\"identity_level\":\"L2\",\"credential_no\":\"44088******75\",\"way_code\":\"YSS\"},{\"auth_time\":null,\"uniqueid\":\"***764486f93fb61212***\",\"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\":\"*****764486f93fb612122*****\",\"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\":\"rxf0MFT7eQqYgYKWtgzNBi6mhS2tbqkPgI \"}");
          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.xymy.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>
    */
}
  • 25
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值