主要针对添加 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、主函数调用后,结果是一样的,此处忽略。