方式一:
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.List;
/**
* Created by chengsheng on 2015/8/19.
*/
public class TestXml2Json {
public static void main(String[] args) throws Exception {
// String xmlStr= readFile("C:\\Users\\yq\\Desktop\\xxx.txt");
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<Service>\r\n" +
"<Service_Header>\r\n" +
"<reply_qmgr>QMAFAIN03</reply_qmgr>\r\n" +
"<service_response>\r\n" +
"<code>0000</code>\r\n" +
"<desc>成功</desc>\r\n" +
"<status>COMPLETE</status>\r\n" +
"</service_response>\r\n" +
"<msglog>1</msglog>\r\n" +
"<timeout>150</timeout>\r\n" +
"<name>XX</name>\r\n" +
"<start_time>1630649964192</start_time>\r\n" +
"<start_timestamp>2021-09-03 14:19:24.192</start_timestamp>\r\n" +
"<service_sn>051320210903131169</service_sn>\r\n" +
"<service_id>05130000000001</service_id>\r\n" +
"<requester_id>0373</requester_id>\r\n" +
"<branch_id>320585100</branch_id>\r\n" +
"<trace_msg>Reply to responseQ - IBM.SERVICE.RESPONSE.OUT.AFE: QMAFAIN03</trace_msg>\r\n" +
"<end_timestamp>2021-09-03 14:19:24.269</end_timestamp>\r\n" +
"</Service_Header>\r\n" +
"<Service_Body>\r\n" +
"<request>\r\n" +
"<querytype>1</querytype>\r\n" +
"<cust_id>2015002410</cust_id>\r\n" +
"<cust_name/>\r\n" +
"<cert_type/>\r\n" +
"<cert_id/>\r\n" +
"<frcode>057</frcode>\r\n" +
"<orgcode>320585100</orgcode>\r\n" +
"<usercode>0625</usercode>\r\n" +
"<syscode>cmis</syscode>\r\n" +
"</request>\r\n" +
"<response>\r\n" +
"<response>\r\n" +
"<result_code>0000</result_code>\r\n" +
"<result_info>成功</result_info>\r\n" +
"<alarminfo>\r\n" +
"<risklevel>3</risklevel>\r\n" +
"<riskcreatedate>2020/09/10</riskcreatedate>\r\n" +
"<alarmsignal>\r\n" +
"<alarmsignaldetail>\r\n" +
"<alarmsignallevel>3</alarmsignallevel>\r\n" +
"<signalcreatedate>2020/09/09</signalcreatedate>\r\n" +
"<signalno>C008</signalno>\r\n" +
"<signaldesc>大苏打大苏打</signaldesc>\r\n" +
"<signalStatus>50</signalStatus>\r\n" +
"<Inputuserid>0625</Inputuserid>\r\n" +
"<Inputorgid>103210</Inputorgid>\r\n" +
"<SignalType>1</SignalType>\r\n" +
"<Customerid>2015002410</Customerid>\r\n" +
"<Alarminfono>TC2020091007830511</Alarminfono>\r\n" +
"<SOURCETYPE>0101</SOURCETYPE>\r\n" +
"<CUSTOMERNAME></CUSTOMERNAME>\r\n" +
"<FRID>057</FRID>\r\n" +
"</alarmsignaldetail>\r\n" +
"</alarmsignal>\r\n" +
"<alarmsignal>\r\n" +
"<alarmsignaldetail>\r\n" +
"<alarmsignallevel>1</alarmsignallevel>\r\n" +
"<signalcreatedate>2018/09/18</signalcreatedate>\r\n" +
"<signalno>P335</signalno>\r\n" +
"<signaldesc>dqwdw</signaldesc>\r\n" +
"<signalStatus>50</signalStatus>\r\n" +
"<Inputuserid>0660</Inputuserid>\r\n" +
"<Inputorgid>103210</Inputorgid>\r\n" +
"<SignalType>1</SignalType>\r\n" +
"<Customerid>2015002410</Customerid>\r\n" +
"<Alarminfono>TC2018091906817166</Alarminfono>\r\n" +
"<SOURCETYPE>0101</SOURCETYPE>\r\n" +
"<CUSTOMERNAME></CUSTOMERNAME>\r\n" +
"<FRID>057</FRID>\r\n" +
"</alarmsignaldetail>\r\n" +
"</alarmsignal>\r\n" +
"<alarmsignal>\r\n" +
"<alarmsignaldetail>\r\n" +
"<alarmsignallevel>1</alarmsignallevel>\r\n" +
"<signalcreatedate>2020/10/09</signalcreatedate>\r\n" +
"<signalno>P258</signalno>\r\n" +
"<signaldesc>测试</signaldesc>\r\n" +
"<signalStatus>20</signalStatus>\r\n" +
"<Inputuserid>0625</Inputuserid>\r\n" +
"<Inputorgid>103210</Inputorgid>\r\n" +
"<SignalType>1</SignalType>\r\n" +
"<Customerid>2015002410</Customerid>\r\n" +
"<Alarminfono>TC2020101007868195</Alarminfono>\r\n" +
"<SOURCETYPE>0101</SOURCETYPE>\r\n" +
"<CUSTOMERNAME></CUSTOMERNAME>\r\n" +
"<FRID>057</FRID>\r\n" +
"</alarmsignaldetail>\r\n" +
"</alarmsignal>\r\n" +
"</alarminfo>\r\n" +
"</response>\r\n" +
"</response>\r\n" +
"</Service_Body>\r\n" +
"</Service>";
JSONObject json = xml2Json(xmlStr);
System.out.println("xml2Json:"+json.toJSONString());
}
public static String readFile(String path) throws Exception {
File file=new File(path);
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
ByteBuffer bb = ByteBuffer.allocate(new Long(file.length()).intValue());
//fc向buffer中读入数据
fc.read(bb);
bb.flip();
String str=new String(bb.array(),"UTF8");
fc.close();
fis.close();
return str;
}
/**
* xml转json
* @param xmlStr
* @return
* @throws DocumentException
*/
public static JSONObject xml2Json(String xmlStr) throws DocumentException{
Document doc= DocumentHelper.parseText(xmlStr);
Element rootElement = doc.getRootElement();
JSONObject rootJson=new JSONObject();
JSONObject json=new JSONObject();
//设置根节点
String name = rootElement.getName();
rootJson.put(name,json);
dom4j2Json(rootElement, json);
return rootJson;
}
/**
* xml转json
* @param element
* @param json
*/
public static void dom4j2Json(Element element,JSONObject json){
//如果是属性
for(Object o:element.attributes()){
Attribute attr=(Attribute)o;
if(!isEmpty(attr.getValue())){
json.put("@"+attr.getName(), attr.getValue());
}
}
List<Element> chdEl=element.elements();
if(chdEl.isEmpty()&&!isEmpty(element.getText())){//如果没有子元素,只有一个值
json.put(element.getName(), element.getText());
}
for(Element e:chdEl){//有子元素
if(!e.elements().isEmpty()){//子元素也有子元素
JSONObject chdjson=new JSONObject();
dom4j2Json(e,chdjson);
Object o=json.get(e.getName());
if(o!=null){
JSONArray jsona=null;
if(o instanceof JSONObject){//如果此元素已存在,则转为jsonArray
JSONObject jsono=(JSONObject)o;
json.remove(e.getName());
jsona=new JSONArray();
jsona.add(jsono);
jsona.add(chdjson);
}
if(o instanceof JSONArray){
jsona=(JSONArray)o;
jsona.add(chdjson);
}
json.put(e.getName(), jsona);
}else{
if(!chdjson.isEmpty()){
json.put(e.getName(), chdjson);
}
}
}else{//子元素没有子元素
for(Object o:element.attributes()){
Attribute attr=(Attribute)o;
if(!isEmpty(attr.getValue())){
json.put("@"+attr.getName(), attr.getValue());
}
}
if(!e.getText().isEmpty()){
json.put(e.getName(), e.getText());
}
}
}
}
public static boolean isEmpty(String str) {
if (str == null || str.trim().isEmpty() || "null".equals(str)) {
return true;
}
return false;
}
}
方式二:
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;
public class MyTest {
private static final String XML_TEXT = "<?xml version=\"1.0\" encoding=\"utf-8\"?> <Service> <Service_Header> <service_response> <status>COMPLETE</status> <code>000000</code> <desc>交易成功</desc> </service_response> </Service_Header> <Service_Body> <ext_attributes> <templatecode>000131</templatecode> <transcode>200020</transcode> <channelcode>033</channelcode> <channeldate>20191203</channeldate> <channelseq>175336047666</channelseq> <brno>321081999</brno> <tellerno>321081999B05</tellerno> <terminalno>321081999B05</terminalno> <chktellerno></chktellerno> <authtellerno></authtellerno> <authtellerno2></authtellerno2> <areacode>3129</areacode> <itemno>120135</itemno> <subitemno>00</subitemno> <chkdate>20191203</chkdate> <hostdate></hostdate> <hostseq></hostseq> <hostret></hostret> <hostretmsg></hostretmsg> <statedate>20191203</statedate> <agentserialno>0091883560</agentserialno> <errorcode>000000</errorcode> <errormsg>交易成功</errormsg> </ext_attributes> <response> <return_code>07</return_code> <return_msg>等待用户输入支付密码</return_msg> <out_trade_no/> <transdatetime>20191203091708</transdatetime> </response> </Service_Body> </Service> ";
//格式化
private static final int PRETTY_PRINT_INDENT_FACTOR = 4;
public static void main(String[] args) {
JSONObject xmlJSONObj;
String jsonPrettyPrintString="";
try {
xmlJSONObj = XML.toJSONObject(XML_TEXT);
jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(jsonPrettyPrintString);
}
}
转换结果
{
“Service”: {
“Service_Header”: {
“service_response”: {
“code”: “000000”,
“status”: “COMPLETE”,
“desc”: “交易成功”
}
},
“Service_Body”: {
“ext_attributes”: {
“terminalno”: “321081999B05”,
“hostretmsg”: “”,
“hostret”: “”,
“chkdate”: 20191203,
“transcode”: 200020,
“chktellerno”: “”,
“hostdate”: “”,
“hostseq”: “”,
“itemno”: 120135,
“statedate”: 20191203,
“channelcode”: 33,
“areacode”: 3129,
“errormsg”: “交易成功”,
“channeldate”: 20191203,
“authtellerno”: “”,
“tellerno”: “321081999B05”,
“channelseq”: 175336047666,
“authtellerno2”: “”,
“templatecode”: “000131”,
“subitemno”: “00”,
“agentserialno”: “0091883560”,
“errorcode”: “000000”,
“brno”: 321081999
},
“response”: {
“out_trade_no”: “”,
“return_msg”: “等待用户输入支付密码”,
“transdatetime”: 20191203091708,
“return_code”: 7
}
}
}
}