Json转Xml,并加root节点--Java&Kotlin

主要针对添加 root 节点的需求,网上的在线工具都是没有 root 节点的。用的是安卓的环境,所以依赖方式有点差别,自己搜一下对应的包,之后依赖就行。
如果没有 root 节点的要求,推荐一个在线转换工具:https://www.bejson.com/xml2json/

第一种方式 - 用net.javacrumbs:json-xml包

1、添加依赖

implementation 'net.javacrumbs:json-xml:4.2'

2、工具类 – Utils.kt

import net.javacrumbs.json2xml.JsonXmlReader
import org.xml.sax.InputSource
import java.io.ByteArrayOutputStream
import java.io.StringReader
import javax.xml.transform.Transformer
import javax.xml.transform.TransformerFactory
import javax.xml.transform.sax.SAXSource
import javax.xml.transform.stream.StreamResult

// 用kotlin是写多行String的时候方便点,直接粘贴过来就能用
object Utils {
    
    
    fun json2xml() {
    
    
        val requestStr = """
            {
                "PatCardType":"123456",
                "PatCardNo":"12"
            }    
        """.trimIndent()
        handle(requestStr, "Request")

        val responseStr = """
            {
                "ResultCode":"011",
                "ResultMessage":"011"
            }
        """.trimIndent()

        handle(responseStr, "Response")
    }

    /**
     * @param json String   待转换的json
     * @param root String   root节点
     */
    private fun handle(json: String, root: String) {
    
    
        try {
    
    
            val request = convertToXml(
                json, root
            )
            println(request)
        } catch (e: Exception) {
    
    
            e.printStackTrace()
        }
    }
    
    @Throws(java.lang.Exception::class)
    fun convertToXml(json: String, root: String): String {
    
    
        val reader = JsonXmlReader(null, false, root)
        val out = ByteArrayOutputStream()
        val transformer: Transformer = TransformerFactory.newInstance().newTransformer()
        val source = InputSource(StringReader(json))
        val result = StreamResult(out)
        transformer.transform(SAXSource(reader, source), result)
        return String(out.toByteArray())
    }
}

2、main函数执行一下

public static void main(String[] args) {
    
    
        Utils.INSTANCE.json2xml();
    }

3、转换后结果

<?xml version="1.0" encoding="UTF-8"?>
<Request>
    <PatCardType>123456</PatCardType>
    <PatCardNo>12</PatCardNo>
</Request>
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <ResultCode>011</ResultCode>
    <ResultMessage>011</ResultMessage>
</Response>

第二种

1、依赖

implementation group: 'net.sf.json-lib', name: 'json-lib', version: '2.4', classifier: 'jdk15'
implementation 'org.dom4j:dom4j:2.0.0'

2、工具类 – Util

import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.Set;

public class Util {
    
    

    //处理json数组转xml丢节点问题
    public static String json2XmlString(String jsonStr,String rootName){
    
    
        JSONObject jsonObj = null;
        String xmlResult = "";
        if(StringUtils.isNotBlank(jsonStr)){
    
    
            try {
    
    
                jsonObj = JSONObject.fromObject(jsonStr);
            } catch (Exception e) {
    
    
                e.printStackTrace();
            }
            // 创建dom对象
            Document document = DocumentHelper.createDocument();
            // 设置编码格式
            document.setXMLEncoding("utf-8");
            Element parentElement = document.addElement(rootName);
            Set<String> keySet = jsonObj.keySet();
            for (String key : keySet) {
    
    
                // 判断此时key的value是否是json数组
                Object json = jsonObj.get(key);
                if (json instanceof JSONArray) {
    
    
                    // 处理json数组
                    jsonArrayToXml((JSONArray) json, parentElement,key);
                } else if (json instanceof JSONObject) {
    
    
                    Element childrenElement = parentElement.addElement(key);
                    JSONObject object = (JSONObject) jsonObj.get(key);
                    for (Object key2 : object.keySet()) {
    
    
                        Element childrenElement2 = childrenElement.addElement(String.valueOf(key2));
                        // 再次判断
                        if (jsonObj.get(key2) instanceof JSONArray) {
    
    
                            jsonArrayToXml((JSONArray) jsonObj.get(key2), childrenElement2,String.valueOf(key2));
                        } else {
    
    
                            childrenElement2.setText(object.getString(String.valueOf(key2)));
                        }
                    }
                } else {
    
    
                    Element childrenElement = parentElement.addElement(key);
                    childrenElement.setText(jsonObj.get(key).toString());
                }

            }
            xmlResult = document.asXML();//如果不要第一行,可以这样写document.getRootElement().asXML();
        }else{
    
    
            xmlResult = "<"+rootName+"></"+rootName+">";
        }

        return xmlResult;
    }

    /**
     *
     * @param jsonArray
     * @param parentElement
     * @param parentKey 父节点
     */
    public static void jsonArrayToXml(JSONArray jsonArray, Element parentElement, String parentKey) {
    
    
        for (int i = 0; i < jsonArray.size(); i++) {
    
    
            Element childrenElement = parentElement.addElement(parentKey);
            JSONObject jsonObject = (JSONObject) jsonArray.get(i);
            for (Object key : jsonObject.keySet()) {
    
    

                Object arry = jsonObject.get(key);
                if (arry instanceof JSONArray) {
    
    
                    // 递归
                    jsonArrayToXml((JSONArray) arry, childrenElement,key+"");
                } else {
    
    
                    Element addElement = childrenElement.addElement(String.valueOf(key));
                    addElement.setText(jsonObject.get(key).toString());
                }
            }
        }
    }
}

3、调用

fun handle {
    
    
		val requestStr = """
            {
                "PatCardType":"123456",
                "PatCardNo":"12"
            }    
        """.trimIndent()

        val responseStr = """
            {
                "ResultCode":"011",
                "ResultMessage":"011"
            }
        """.trimIndent()

         val requestResult= Util.json2XmlString(requestStr, "Request")
         println(requestResult)

        val responseResult= Util.json2XmlString(responseStr, "Response")
        println(responseResult)
}

4、主函数调用后,结果是一样的,此处忽略。

猜你喜欢

转载自blog.csdn.net/weixin_44565784/article/details/118327641