小记
这里用的是fastjson
xml转json可给我折腾苦了,首先不是正常的xml格式<a>123</a>
,而是<a value = "123" />
,如果只是单层嵌套,例如:
<Message><Public><a value="123" /><b value = "456" /><c value = "789" /></Public></Message>
,这种的还好说,循环一下结束战斗
目前是这种样子的xml格式,例如:
<Message><Public><a value="123" /><b value = "456" /><Hello><World><c value = "789" /><d value = "101" /></World></Hello></Public></Message>
,这个就有点难住我了。
我先说下我的思路(行不通),首先直接获取
Element publicEle = document.getRootElement().element("Public");
之后开始转jsonObject然后开始循环,将每个节点放入map里面,然后递归,再然后map转json,有个地方卡壳了,如果在这个地方,例:
<Hello><World><c value = "789" /><d value = "101"></World></Hello>
<Hello>
中是没有value
属性的,所以不能放到map里面,可能需要放到List
里面,但是放入List
里面之后不知道怎么记着这个节点位置,而且还要递归,递归完之后再map
转json
或者list
放入map
中,总之是行不通,转换不了。
换一个思路,换一个,既然这是特殊格式的xml,那么咱们就把特殊格式的xml转为正常格式的xml,然后再将正常的xml转为json。
下面放代码:
//放几个必要的
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public static String xml3Json(String xmlStr) throws DocumentException {
Document document = DocumentHelper.parseText(xmlStr);
Element publicEle = document.getRootElement().element("Public");
xmlToJsonList(publicEle);
String asXML = publicEle.asXML();
//正常模式的xml快速转json格式
org.json.JSONObject jsonObject = XML.toJSONObject(asXML);
JSONObject json = (JSONObject) JSON.parse(jsonObject.toString());
return json.get("Public").toString();
}
@SuppressWarnings("unchecked")
public static void xmlToJsonList(Element publicEle) {
List<Element> elements = publicEle.elements();
for(Element element : elements){
if(element.attribute("value") != null){
//先得到该值
String value = element.attributeValue("value");
//再去除value属性
element.remove(element.attribute("value"));
//再为该节点添加值
element.setText(value);
}else{
//递归
xmlToJsonList(element);
}
}
}
测试:
public static void main(String[] args) throws DocumentException {
String x1="<?xml version=\"1.0\" encoding=\"GB18030\"?><Message><Public><TxnCode value=\"CT02\" /><aaaa><SiteID value=\"00000001\" /><bbbb><TermID value=\"\" /><ffff><gggg><hhhh><tttt value=\"你好\" /></hhhh></gggg></ffff></bbbb><TxnBatchNo value=\"20170607152322\" /></aaaa><TxnSeq value=\"1\" /><TlrNo value=\"01\" /><CardNo value=\"2017000100000003\" /><Amt value=\"0.01\" /><OprType value=\"01\" /><RelTxnSsn value=\"IPEM00000000320170607152231\" /></Public></Message>";
System.out.println(xml3Json(x1));
}
输出(格式化后的):
{
"Amt": 0.01,
"CardNo": 2017000100000003,
"OprType": "01",
"RelTxnSsn": "IPEM00000000320170607152231",
"TlrNo": "01",
"TxnCode": "CT02",
"TxnSeq": 1,
"aaaa": {
"SiteID": "00000001",
"TxnBatchNo": 20170607152322,
"bbbb": {
"TermID": "",
"ffff": {
"gggg": {
"hhhh": { "tttt": "你好" } }
}
}
}
}
这样就暂时搞定了,不过还需要研究一下xml正常模式转json格式。
注:转载请说明出处。