xml转为json,并解析json

本文介绍了一种使用Java实现的XML文件解析成JSON格式的方法,通过SAX解析器结合JDOM2和FastJSON库,实现了从XML数据到JSON数据的转换,并提供了完整的代码示例。

开篇:一般公司的项目,很多是返回xml报文,如何将xml解析为json,这里采用一种方法,sax解析方式

一.maven 依赖

<dependency>
    <groupId>org.jdom</groupId>
   <artifactId>jdom2</artifactId>
   <version>2.0.6</version>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.46</version>
</dependency>

二.代码如下

public class TestXml2Json {
    public static void main(String[] args) throws JDOMException, IOException {
        String xml="<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                "<MoBaoAccount MessageType=\"UserMobilePay\" PlatformID=\"b2ctest\">" +
                "<OrderNo>M20150521084825</OrderNo>" +
                "<TradeAmt>5000.00</TradeAmt>" +
                "<Commission>0.5</Commission>" +
                "<UserID>zhangbingfa</UserID>" +
                "<MerchID>zhangbingfa</MerchID>" +
                "<tradeType>0</tradeType>" +
                "<CustParam>123</CustParam> " +
                "</MoBaoAccount>";
        //解析xml文档
        JSONObject json=xml2Json(xml.getBytes());
        //解析json数据
        JSONObject moBaoAccount = (JSONObject) json.get("MoBaoAccount");
        List commission = (List) moBaoAccount.get("Commission");
        Order order = new Order();
        //封装为自定义对象
        order.setCommission((String) commission.get(0));
        System.out.println(order.getOrderNo()+">>>>>>>>>"+order.getCommission()+">>>>>>>"+order.getTradeAmt());
        System.out.println(json.toJSONString());

    }

    public static JSONObject xml2Json(byte[] xml) throws JDOMException, IOException {
        JSONObject jsonObject = new JSONObject();
        //将字符串转换为输入流
        InputStream is = new ByteArrayInputStream(xml);
        //用sax解析,解析一行丢一行
        SAXBuilder saxBuilder = new SAXBuilder();
        //获得xml文档
        Document document = saxBuilder.build(is);
        //获得根元素,例如xml
        Element rootElement = document.getRootElement();
        //调用具体解析方法
        jsonObject.put(rootElement.getName(),iterateElement(rootElement));
        return jsonObject;
    }

    private static JSONObject iterateElement(Element rootElement) {
        //获得所有子元素的集合
        List note = rootElement.getChildren();
        Element et;
        JSONObject jsonObject = new JSONObject();
        List list;
        for(int i=0;i<note.size();i++){
            list = new LinkedList();
            et = (Element) note.get(i);
            //此处是从>解析到<,如果有嵌套的子节点,则递归遍历
            if(et.getTextTrim().equals("")){
                if(et.getChildren().size() == 0) continue;
                //有这个键,则用最新的值替换
                if(jsonObject.containsKey(et.getName())){
                    list = (List)jsonObject.get(et.getName());
                }
                list.add(iterateElement(et));
                jsonObject.put(et.getName(),list);
            }else{
                if(jsonObject.containsKey(et.getName())){
                    list = (List)jsonObject.get(et.getName());
                }
                //获得值,例如<a>1</a>,得到1
                list.add(et.getTextTrim());
                jsonObject.put(et.getName(),list);
            }
        }
        return jsonObject;
    }
}
class Order{
    private String OrderNo;
    private String TradeAmt;
    private String Commission;

    public String getOrderNo() {
        return OrderNo;
    }

    public void setOrderNo(String orderNo) {
        OrderNo = orderNo;
    }

    public String getTradeAmt() {
        return TradeAmt;
    }

    public void setTradeAmt(String tradeAmt) {
        TradeAmt = tradeAmt;
    }

    public String getCommission() {
        return Commission;
    }

    public void setCommission(String commission) {
        Commission = commission;
    }
}

三,结果如下


{
"MoBaoAccount": {
"MerchID": ["zhangbingfa"],
"UserID": ["zhangbingfa"],
"Commission": ["0.5"],
"OrderNo": ["M2015052198456"],
"TradeAmt": ["5000.00"],
"CustParam": ["321"],
"tradeType": ["0"]
}

}

在 Python 中,有多种方法可以将 XML 文件转换为 JSON 格式。以下是几种常见的实现方式: #### 使用 `xmltodict` 库 `xmltodict` 库可以将 XML 数据转换为 Python 的字典类型,然后使用 `json` 库将字典转换为 JSON 字符串。 ```python import json import xmltodict # 打开 XML 文件读取内容 with open('input.xml') as xml_file: parser_data = xmltodict.parse(xml_file.read()) # 将 Python 对象编码成 JSON 字符串 json_conversion = json.dumps(parser_data) # 写入 JSON 文件 with open('output.json', 'w') as json_file: json_file.write(json_conversion) ``` 此方法适用于处理简单到中等复杂度的 XML 数据,能简化 XML 处理过程 [^1][^2][^3]。 #### 使用 `xml.etree.ElementTree` 手动转换 可以使用 Python 内置的 `xml.etree.ElementTree` 模块解析 XML 文件,然后手动将其转换为 JSON 格式。 ```python import json import xml.etree.ElementTree as ET def xml2json(node): data = {} if node.attrib: data['@attributes'] = node.attrib if node.text and node.text.strip(): data['#text'] = node.text.strip() children = list(node) if children: for child in children: child_data = xml2json(child) if child.tag in data: if isinstance(data[child.tag], list): data[child.tag].append(child_data) else: data[child.tag] = [data[child.tag], child_data] else: data[child.tag] = child_data return data path = "./temp.xml" tree = ET.parse(path) node = tree.getroot() tag, data = xml2json(node) with open("./temp.json", "w", encoding="utf-8") as f: f.write(json.dumps(data, ensure_ascii=False, indent=4)) ``` 这种方法可以更灵活地控制转换过程,但代码相对复杂 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值