项目场景:
对接建行对账
问题描述:
建行以xml格式传入数据,解析复杂,希望把xml转json
<?xml version="1.0" encoding="GB18030"?>
<TX>
<REQUEST_SN>0145</REQUEST_SN>
<CUST_ID>105331000007345</CUST_ID>
<TX_CODE>5W1002</TX_CODE>
<RETURN_CODE>000000</RETURN_CODE>
<RETURN_MSG></RETURN_MSG>
<LANGUAGE>CN</LANGUAGE>
<TX_INFO>
<CUR_PAGE>1</CUR_PAGE>
<PAGE_COUNT>45</PAGE_COUNT>
<LIST>
<TRAN_DATE>2020-12-03 21:02:10</TRAN_DATE>
<ACC_DATE>2020-12-03</ACC_DATE>
<ORDER>0720201203001477184231</ORDER>
<ACCOUNT>************8888</ACCOUNT>
<ACC_NAME>***************************I</ACC_NAME>
<PAYMENT_MONEY>10.00</PAYMENT_MONEY>
<REFUND_MONEY>0.00</REFUND_MONEY>
<POS_ID>046592052</POS_ID>
<REM1></REM1>
<REM2></REM2>
<ORDER_STATUS>1</ORDER_STATUS>
<PAY_MODE>CFT</PAY_MODE>
<Orig_Amt>10.00</Orig_Amt>
<Txn_ClrgAmt>10.00</Txn_ClrgAmt>
<MrchCmsn_Amt>0.00</MrchCmsn_Amt>
<Discount_Amt></Discount_Amt>
<OriOvrlsttnEV_Trck_No>1010113701607000530865411</OriOvrlsttnEV_Trck_No>
<MsgRp_Jrnl_No></MsgRp_Jrnl_No>
<CrCrd_Instm_Prd_Num>0</CrCrd_Instm_Prd_Num>
<Crd_Attr_Bmp_Def_ID>01080</Crd_Attr_Bmp_Def_ID>
<DstCrd_IssuBnk_InsNo>OTHERS</DstCrd_IssuBnk_InsNo>
<OnlnPcsgInd_1_Bmp_ECD></OnlnPcsgInd_1_Bmp_ECD>
<TxnAmt>10.00</TxnAmt>
<Cst_Tp_Prft_Dsc></Cst_Tp_Prft_Dsc>
</LIST>
<LIST>
<TRAN_DATE>2020-12-03 20:54:00</TRAN_DATE>
<ACC_DATE>2020-12-03</ACC_DATE>
<ORDER>20201203205351037416418883MP6005</ORDER>
<ACCOUNT>************8888</ACCOUNT>
<ACC_NAME>***************************g</ACC_NAME>
<PAYMENT_MONEY>24.00</PAYMENT_MONEY>
<REFUND_MONEY>0.00</REFUND_MONEY>
<POS_ID>042038997</POS_ID>
<REM1>20201203205351421005</REM1>
<REM2></REM2>
<ORDER_STATUS>1</ORDER_STATUS>
<PAY_MODE>CFT</PAY_MODE>
<Orig_Amt>24.00</Orig_Amt>
<Txn_ClrgAmt>24.00</Txn_ClrgAmt>
<MrchCmsn_Amt>0.00</MrchCmsn_Amt>
<Discount_Amt></Discount_Amt>
<OriOvrlsttnEV_Trck_No>1010114341607000039436309</OriOvrlsttnEV_Trck_No>
<MsgRp_Jrnl_No></MsgRp_Jrnl_No>
<CrCrd_Instm_Prd_Num>0</CrCrd_Instm_Prd_Num>
<Crd_Attr_Bmp_Def_ID>01080</Crd_Attr_Bmp_Def_ID>
<DstCrd_IssuBnk_InsNo>OTHERS</DstCrd_IssuBnk_InsNo>
<OnlnPcsgInd_1_Bmp_ECD></OnlnPcsgInd_1_Bmp_ECD>
<TxnAmt>24.00</TxnAmt>
<Cst_Tp_Prft_Dsc></Cst_Tp_Prft_Dsc>
</LIST>
<NOTICE></NOTICE>
</TX_INFO>
</TX>
解决方案:
引入pom文件
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!--FASTJSON是当今处理json效率最高的json处理工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
工具类
package com.wgzf.account;
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;
/**
* @Author: wgs
* @Date: 2020/12/5
*/
@SuppressWarnings("all")
public class TestXml2Json {
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);
JSONObject json=new JSONObject();
dom4j2Json(doc.getRootElement(), json);
return json;
}
/**
* 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;
}
}
测试
public static void main(String[] args) throws Exception {
String xmlRequest = " " +
"<TX>\n" +
" <REQUEST_SN>0145</REQUEST_SN>\n" +
" <CUST_ID>105331000007345</CUST_ID>\n" +
" <TX_CODE>5W1002</TX_CODE>\n" +
" <RETURN_CODE>000000</RETURN_CODE>\n" +
" <RETURN_MSG></RETURN_MSG>\n" +
" <LANGUAGE>CN</LANGUAGE>\n" +
" <TX_INFO>\n" +
" <CUR_PAGE>1</CUR_PAGE>\n" +
" <PAGE_COUNT>45</PAGE_COUNT>\n" +
" <LIST>\n" +
" <TRAN_DATE>2020-12-03 23:06:20</TRAN_DATE>\n" +
" <ACC_DATE>2020-12-03</ACC_DATE>\n" +
" <ORDER>20201203230613000000533039MP7060</ORDER>\n" +
" <ACCOUNT>************8888</ACCOUNT>\n" +
" <ACC_NAME>***************************s</ACC_NAME>\n" +
" <PAYMENT_MONEY>30.00</PAYMENT_MONEY>\n" +
" <REFUND_MONEY>0.00</REFUND_MONEY>\n" +
" <POS_ID>034658773</POS_ID>\n" +
" <REM1>20201203230613215091</REM1>\n" +
" <REM2></REM2>\n" +
" <ORDER_STATUS>1</ORDER_STATUS>\n" +
" <PAY_MODE>CFT</PAY_MODE>\n" +
" <Orig_Amt>30.00</Orig_Amt>\n" +
" <Txn_ClrgAmt>30.00</Txn_ClrgAmt>\n" +
" <MrchCmsn_Amt>0.00</MrchCmsn_Amt>\n" +
" <Discount_Amt></Discount_Amt>\n" +
" <OriOvrlsttnEV_Trck_No>1010114181607007980594026</OriOvrlsttnEV_Trck_No>\n" +
" <MsgRp_Jrnl_No></MsgRp_Jrnl_No>\n" +
" <CrCrd_Instm_Prd_Num>0</CrCrd_Instm_Prd_Num>\n" +
" <Crd_Attr_Bmp_Def_ID>01080</Crd_Attr_Bmp_Def_ID>\n" +
" <DstCrd_IssuBnk_InsNo>OTHERS</DstCrd_IssuBnk_InsNo>\n" +
" <OnlnPcsgInd_1_Bmp_ECD></OnlnPcsgInd_1_Bmp_ECD>\n" +
" <TxnAmt>30.00</TxnAmt>\n" +
" <Cst_Tp_Prft_Dsc></Cst_Tp_Prft_Dsc>\n" +
" </LIST>\n" +
" <LIST>\n" +
" <TRAN_DATE>2020-12-03 22:44:56</TRAN_DATE>\n" +
" <ACC_DATE>2020-12-03</ACC_DATE>\n" +
" <ORDER>20201203224443047833001946MP6636</ORDER>\n" +
" <ACCOUNT>************6231</ACCOUNT>\n" +
" <ACC_NAME>**********7</ACC_NAME>\n" +
" <PAYMENT_MONEY>35.00</PAYMENT_MONEY>\n" +
" <REFUND_MONEY>0.00</REFUND_MONEY>\n" +
" <POS_ID>034658773</POS_ID>\n" +
" <REM1>20201203224443461899</REM1>\n" +
" <REM2></REM2>\n" +
" <ORDER_STATUS>1</ORDER_STATUS>\n" +
" <PAY_MODE>ZFB</PAY_MODE>\n" +
" <Orig_Amt>35.00</Orig_Amt>\n" +
" <Txn_ClrgAmt>35.00</Txn_ClrgAmt>\n" +
" <MrchCmsn_Amt>0.00</MrchCmsn_Amt>\n" +
" <Discount_Amt></Discount_Amt>\n" +
" <OriOvrlsttnEV_Trck_No>1010114741607006696757665</OriOvrlsttnEV_Trck_No>\n" +
" <MsgRp_Jrnl_No></MsgRp_Jrnl_No>\n" +
" <CrCrd_Instm_Prd_Num>0</CrCrd_Instm_Prd_Num>\n" +
" <Crd_Attr_Bmp_Def_ID>01070</Crd_Attr_Bmp_Def_ID>\n" +
" <DstCrd_IssuBnk_InsNo></DstCrd_IssuBnk_InsNo>\n" +
" <OnlnPcsgInd_1_Bmp_ECD></OnlnPcsgInd_1_Bmp_ECD>\n" +
" <TxnAmt>35.00</TxnAmt>\n" +
" <Cst_Tp_Prft_Dsc></Cst_Tp_Prft_Dsc>\n" +
" </LIST>\n" +
" <NOTICE></NOTICE>\n" +
" </TX_INFO>\n" +
"</TX>";
Document doc= DocumentHelper.parseText(xmlRequest);
JSONObject json=new JSONObject();
dom4j2Json(doc.getRootElement(),json);
System.out.println("xml2Json:"+json.toJSONString());
}
输出
{
"LANGUAGE":"CN",
"CUST_ID":"105331000007345",
"RETURN_CODE":"000000",
"TX_CODE":"5W1002",
"REQUEST_SN":"0145",
"TX_INFO":{
"CUR_PAGE":"1",
"PAGE_COUNT":"45",
"LIST":[
{
"POS_ID":"034658773",
"REFUND_MONEY":"0.00",
"Txn_ClrgAmt":"30.00",
"ACC_NAME":"***************************s",
"PAY_MODE":"CFT",
"Orig_Amt":"30.00",
"DstCrd_IssuBnk_InsNo":"OTHERS",
"ACC_DATE":"2020-12-03",
"ORDER":"20201203230613000000533039MP7060",
"REM1":"20201203230613215091",
"ACCOUNT":"************8888",
"CrCrd_Instm_Prd_Num":"0",
"Crd_Attr_Bmp_Def_ID":"01080",
"PAYMENT_MONEY":"30.00",
"ORDER_STATUS":"1",
"TxnAmt":"30.00",
"TRAN_DATE":"2020-12-03 23:06:20",
"OriOvrlsttnEV_Trck_No":"1010114181607007980594026",
"MrchCmsn_Amt":"0.00"
},
{
"POS_ID":"034658773",
"REFUND_MONEY":"0.00",
"Txn_ClrgAmt":"35.00",
"ACC_NAME":"**********7",
"PAY_MODE":"ZFB",
"Orig_Amt":"35.00",
"ACC_DATE":"2020-12-03",
"ORDER":"20201203224443047833001946MP6636",
"REM1":"20201203224443461899",
"ACCOUNT":"************6231",
"CrCrd_Instm_Prd_Num":"0",
"Crd_Attr_Bmp_Def_ID":"01070",
"PAYMENT_MONEY":"35.00",
"ORDER_STATUS":"1",
"TxnAmt":"35.00",
"TRAN_DATE":"2020-12-03 22:44:56",
"OriOvrlsttnEV_Trck_No":"1010114741607006696757665",
"MrchCmsn_Amt":"0.00"
}
]
}
}