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
<?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>
*/

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

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值