建行xml转json

项目场景:

对接建行对账


问题描述:

建行以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"
            }
        ]
    }
}

引用文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值