java中json转xml

Json转xml

今天做一个json转xml的工作,想来比较简单,百度了一些感觉不太好,遂自己改写了一个demo,主要用到dom4j和gson。大致思路就是写一个方法遍历json的每一个key和value,碰到有深度的key重复调用本方法(也就是递归啦)。希望对大家有所帮助

下面直接上代码

public class JsonToXml {
	private static final String STR_JSON = "{\"name\":\"yato233\",\"address\":{\"city\":\"beijing\",\"street\":\" longyu Road \",\"postcode\":100000},\"blog\":\"https://blog.csdn.net/baidu_38322198\"}";

	/**
	 * 将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:\\xml" + File.separator + fileName)), format);
			writer.write(document);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
这就是一个小demo了,非常实用。楼主是http请求传入的json串,比较复杂,这里也把json和转化后的xml贴出来
```java
/*
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



  AC00062
  
    
      45754745
      xxx
      547547547547
    
    
      34325325322
      xxx
      52354645462
    
  
  xxx
  哈哈
  
    
      7547547547
      13666666666
      1
    
  
  
    
      121212
      1
    
    
      12121233
      1
    
  

*/

参考博客地址:https://blog.csdn.net/leiguang55555/article/details/53965721

你可能感兴趣的:(java杂记)