簡體   English   中英

Python 以更好的方式解析 JSON 數據

[英]Python parsing JSON data in a better way

我有一些 JSON 數據需要解析。 但是不能完全正確,代碼看起來也不太好。

我的第一個問題是,這可以用比使用嵌套 for 循環更好的方式編寫嗎?

第二個問題。 根據 JSON 結構的設置方式,我無法獲得可靠的 output。我想低於 output。但是因為 .net.0 和 .net.6 處於同一級別,所以不要同時獲得兩者。 有沒有一種巧妙的方法來獲得這個?

('192.168.0.1', 'Established', 'test-x1', '11996', '463')
('192.168.1.2', 'down', 'test-x2', '31996', '363')
#!/usr/bin/python3
import json
json_input = """
{
    "bgp-information" : [
    {
        "attributes" : {"xmlns" : "http://xml.juniper.net/junos/0/junos-routing"}, 
        "bgp-thread-mode" : [
        {
            "data" : "BGP I/O"
        }
        ], 
        "thread-state" : [
        {
        }
        ], 
        "group-count" : [
        {
            "data" : "23"
        }
        ], 
        "peer-count" : [
        {
            "data" : "31"
        }
        ], 
        "down-peer-count" : [
        {
            "data" : "2"
        }
        ], 
        "bgp-peer" : [
        {
            "attributes" : {"junos:style" : "terse", 
                            "heading" : "Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped..."
                           }, 
            "peer-address" : [
            {
                "data" : "192.168.0.1"
            }
            ], 
            "peer-as" : [
            {
                "data" : "65000"
            }
            ], 
            "input-messages" : [
            {
                "data" : "550950"
            }
            ], 
            "output-messages" : [
            {
                "data" : "41235"
            }
            ], 
            "route-queue-count" : [
            {
                "data" : "0"
            }
            ], 
            "flap-count" : [
            {
                "data" : "4"
            }
            ], 
            "elapsed-time" : [
            {
                "data" : "19w0d 23:55:24", 
                "attributes" : {"junos:seconds" : "11577324"}
            }
            ], 
            "description" : [
            {
                "data" : "test-x1"
            }
            ], 
            "peer-state" : [
            {
                "data" : "Established", 
                "attributes" : {"junos:format" : "Establ"}
            }
            ], 
            "bgp-rib" : [
            {
                "attributes" : {"junos:style" : "terse"}, 
                "name" : [
                {
                    "data" : "inet.0"
                }
                ], 
                "active-prefix-count" : [
                {
                    "data" : "9292"
                }
                ], 
                "received-prefix-count" : [
                {
                    "data" : "11929"
                }
                ], 
                "accepted-prefix-count" : [
                {
                    "data" : "11996"
                }
                ], 
                "suppressed-prefix-count" : [
                {
                    "data" : "0"
                }
                ]
            }, 
            {
                "attributes" : {"junos:style" : "terse"}, 
                "name" : [
                {
                    "data" : "inet6.0"
                }
                ], 
                "active-prefix-count" : [
                {
                    "data" : "48"
                }
                ], 
                "received-prefix-count" : [
                {
                    "data" : "493"
                }
                ], 
                "accepted-prefix-count" : [
                {
                    "data" : "463"
                }
                ], 
                "suppressed-prefix-count" : [
                {
                    "data" : "0"
                }
                ]
            }
            ]
        },
        {
            "attributes" : {"junos:style" : "terse"}, 
            "peer-address" : [
            {
                "data" : "192.168.1.2"
            }
            ], 
            "peer-as" : [
            {
                "data" : "65001"
            }
            ], 
            "input-messages" : [
            {
                "data" : "679978"
            }
            ], 
            "output-messages" : [
            {
                "data" : "43663"
            }
            ], 
            "route-queue-count" : [
            {
                "data" : "0"
            }
            ], 
            "flap-count" : [
            {
                "data" : "2"
            }
            ], 
            "elapsed-time" : [
            {
                "data" : "20w1d 20:40:58", 
                "attributes" : {"junos:seconds" : "1256858"}
            }
            ], 
            "description" : [
            {
                "data" : "test-x2"
            }
            ], 
            "peer-state" : [
            {
                "data" : "down", 
                "attributes" : {"junos:format" : "Establ"}
            }
            ], 
            "bgp-rib" : [
            {
                "attributes" : {"junos:style" : "terse"}, 
                "name" : [
                {
                    "data" : "inet.0"
                }
                ], 
                "active-prefix-count" : [
                {
                    "data" : "9953"
                }
                ], 
                "received-prefix-count" : [
                {
                    "data" : "31996"
                }
                ], 
                "accepted-prefix-count" : [
                {
                    "data" : "31996"
                }
                ], 
                "suppressed-prefix-count" : [
                {
                    "data" : "0"
                }
                ]
            }, 
            {
                "attributes" : {"junos:style" : "terse"}, 
                "name" : [
                {
                    "data" : "inet6.0"
                }
                ], 
                "active-prefix-count" : [
                {
                    "data" : "98"
                }
                ], 
                "received-prefix-count" : [
                {
                    "data" : "463"
                }
                ], 
                "accepted-prefix-count" : [
                {
                    "data" : "363"
                }
                ], 
                "suppressed-prefix-count" : [
                {
                    "data" : "0"
                }
                ]
            }
            ]
        }
        ]
    }
    ]
}
"""
json_out = json.loads(json_input)
for value1 in json_out['bgp-information']:
    for value2 in value1['bgp-peer']:
        for value in value2['peer-address']:
            peer = (value['data'])
        for value in value2['peer-state']:
            state = (value['data'])
        for value in value2['description']:
            desc = (value['data'])        
        for value3 in value2['bgp-rib']: # Below part is what i need help with. Assign first hit to variable inet0_accepted_prefix_count and second to inet6_accepted_prefix_count                   
            for value in value3['accepted-prefix-count']:     
                inet0_accepted_prefix_count = (value['data'])
            for value in value3['accepted-prefix-count']: 
                inet6_accepted_prefix_count = (value['data'])       
            print(inet0_accepted_prefix_count,inet6_accepted_prefix_count)
        combined = (peer,state,desc,inet0_accepted_prefix_count,inet6_accepted_prefix_count) #inet0_accepted_prefix_count is missing
        print(combined)

您需要收集名稱: ".net.0"".net6.0"作為單獨dict中的條目,以便能夠收集關聯的"accepted-prefix-count"值:

# json string elided
json_out = json.loads(json_input)
for value1 in json_out['bgp-information']:
    for value2 in value1['bgp-peer']:
        for value in value2['peer-address']:
            peer = (value['data'])
        for value in value2['peer-state']:
            state = (value['data'])
        for value in value2['description']:
            desc = (value['data'])
        d = {}
        for value3 in value2['bgp-rib']:                   
            for value in value3['name']:     
                name = value['data']
            for value in value3['accepted-prefix-count']: 
                accepted_prefix_count = value['data']    
            d[name] = accepted_prefix_count
        combined = (peer, state, desc, d['inet.0'], d['inet6.0']) 
        print(combined)

Output 按要求

此代碼應該可以滿足您的需求。 您可以通過刪除“數據”名稱空間來改進/縮短 json 數據的結構,但前提是您知道您不會 append 任何內容

為了考試。 - "description":[{"data": "test-x2"}] 變成 -> "description": "test-x2"

但這段代碼應該適用於您當前的 json:

json_out = json.loads(json_input)
for value in json_out["bgp-information"][0]["bgp-peer"]:
    peer = value["peer-address"][0]["data"]
    state = value["peer-state"][0]["data"]
    desc = value["description"][0]["data"]
    inet0_accepted_prefix_count = value["bgp-rib"][0]["accepted-prefix-count"][0]["data"]
    inet6_accepted_prefix_count = value["bgp-rib"][1]["accepted-prefix-count"][0]["data"]

    combined = (peer,state,desc,inet0_accepted_prefix_count,inet6_accepted_prefix_count)
    print(combined)

與其他一些供應商相比,Juniper JSON output 的格式不是非常簡單,因此我需要引入一些例外情況。 如果有人需要解析 Junos BGP output,這里有一個基於@MarcusDevs 回答的示例:

json_out = json.loads(json_input)   
for value in json_out["bgp-information"][0]["bgp-peer"]:
            peer = value["peer-address"][0]["data"]
            state = value["peer-state"][0]["data"]
            try:
                desc = value["description"][0]["data"]
            except:
                desc = "X"
            try:
                for value1 in value["bgp-rib"]:
                    try:
                        name = value1["name"][0]["data"]
                    except:
                        name = "X" 
                    try:
                        accepted_prefix_count = value1["accepted-prefix-count"][0]["data"]
                    except:
                        accepted_prefix_count = "X"
                    combined = (peer,state,accepted_prefix_count,name,desc)
                    print(combined)
            except:
                name = "X" 
                accepted_prefix_count = "X"
                combined = (peer,state,accepted_prefix_count,name,desc)
                print(combined)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM