【问题标题】:converting XML to JSON with no root将 XML 转换为没有根的 JSON
【发布时间】:2021-02-18 06:32:00
【问题描述】:

我需要生成一个没有根元素的 JSON 文件。但是,我设法生成了一个没有标签的 XML。我不希望我的 JSON 带有 { "root": 元素。

XML:

<dataSources>
    <xid>DS_000001</xid>
    <type>MODBUS_IP</type>
    <updatePeriodType>MILLISECONDS</updatePeriodType>
    <transportType>TCP</transportType>
    <host>123.456.78.11</host>
    <name>test1</name>
    <port>502</port>
    <updatePeriods>500</updatePeriods>
</dataSources>
<dataSources>
    <xid>DS_000002</xid>
    <type>MODBUS_IP</type>
    <updatePeriodType>MILLISECONDS</updatePeriodType>
    <transportType>TCP</transportType>
    <host>123.456.78.12</host>
    <name>test2</name>
    <port>502</port>
    <updatePeriods>500</updatePeriods>
</dataSources>

<dataPoints>
    <xid>DP_000001</xid>
    <pointLocator>
        <range>HOLDING_REGISTER</range>
        <modbusDataType>FOUR_BYTE_FLOAT</modbusDataType>
        <offset>2848</offset>
    </pointLocator>
    <engineeringUnits/>
    <dataSourceXid>DS_000001</dataSourceXid>
    <deviceName>test1</deviceName>
    <name>line_load_percent00</name>
</dataPoints>

<dataPoints>
    <xid>DP_000002</xid>
    <pointLocator>
        <range>HOLDING_REGISTER</range>
        <modbusDataType>FOUR_BYTE_FLOAT</modbusDataType>
        <offset>2850</offset>
    </pointLocator>
    <engineeringUnits/>
    <dataSourceXid>DS_000001</dataSourceXid>
    <deviceName>test1</deviceName>
    <name>line_load_percent01</name>
</dataPoints>

<dataPoints>
<xid>DP_000003</xid>
    <pointLocator>
        <range>HOLDING_REGISTER</range>
        <modbusDataType>FOUR_BYTE_FLOAT</modbusDataType>
        <offset>2852</offset>
    </pointLocator>
<engineeringUnits/>
<dataSourceXid>DS_000002</dataSourceXid>
<deviceName>test2</deviceName>
<name>line_load_percent02</name>
</dataPoints>

Python:

with open("test1.xml", 'r') as xml_file:

    obj = xmltodict.parse(xml_file.read())
    xml_file.close()

json_data = json.dumps(obj, indent=4)

with open("data.json", "w") as json_file:
    json_file.write(json_data)
    json_file.close()

我想要的输出:

{
        "dataSources": [
            {
                "xid": "DS_000001",
                "type": "MODBUS_IP",
                "transportType": "TCP",
                "updatePeriodType": "MILLISECONDS",
                "host": "123.456.78.11",
                "name": "test1",
                "port": 502,
                "updatePeriods": 500
            },
            {
                "xid": "DS_000002",
                "type": "MODBUS_IP",
                "transportType": "TCP",
                "updatePeriodType": "MILLISECONDS",
                "host": "123.456.78.12",
                "name": "test2",
                "port": 502,
                "updatePeriods": 500
            }
        ],
        "dataPoints": [
            {
                "xid": "DP_00001",
                "pointLocator": {
                    "range": "HOLDING_REGISTER",
                    "modbusDataType": "FOUR_BYTE_FLOAT",
                    "offset": 2848
                },
                "engineeringUnits": null,
                "dataSourceXid": "DS_000001",
                "deviceName": "test1",
                "name": "line_load_percent00"
            },
            {
                "xid": "DP_00002",
                "pointLocator": {
                    "range": "HOLDING_REGISTER",
                    "modbusDataType": "FOUR_BYTE_FLOAT",
                    "offset": 2850
                },
                "engineeringUnits": null,
                "dataSourceXid": "DS_000001",
                "deviceName": "test1",
                "name": "line_load_percent01"
            },
            {
                    "xid": "DP_00003",
                    "pointLocator": {
                        "range": "HOLDING_REGISTER",
                        "modbusDataType": "FOUR_BYTE_FLOAT",
                        "offset": 2852
                    },
                    "engineeringUnits": null,
                    "dataSourceXid": "DS_000002",
                    "deviceName": "test2",
                    "name": "line_load_percent02"
                }
        ]
}

对于只有数字的数据,如偏移量、端口等,如何在 JSON 中将其保存为整数而不是字符串值?

谢谢

【问题讨论】:

    标签: python json xml


    【解决方案1】:

    用一个临时根包裹xml,然后在最后去掉它。

    另外,从How to convert string int JSON into real int with json.loads 获得_decode 代码

    import json
    import xmltodict
    
    ### this function code is from the link
    def _decode(o):
        if isinstance(o, str) and o.isdigit():  # slight twist from original code for checking int
                return int(o)
        elif isinstance(o, dict):
            return {k: _decode(v) for k, v in o.items()}
        elif isinstance(o, list):
            return [_decode(v) for v in o]
        else:
            return o
    
    with open("test1.xml", 'r') as xml_file:
    
        xml_string = xml_file.read()
        xml_string = "<root>" + xml_string + "</root>"  # wrap with temp <root>
        obj = xmltodict.parse(xml_string)
        xml_file.close()
    
    json_string = json.dumps(xmltodict.parse(xml_string), indent=4)
    json_data = json.loads(json_string, object_hook=_decode)["root"]  # <root> out
    
    with open("data.json", 'w') as json_file:
        json.dump(json_data, json_file)
        json_file.close()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 2011-06-18
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多