以良好的方式解析 JSON 数据

Parsing JSON data in a good way

我有一些 JSON 结构化输出,我想对其进行解析并从中获取一些值。但是我的尝试在更深的嵌套 JSON 中并不好也不可行。从下面的 JSON 示例中获取键和值的好方法是什么?

假设我想为每个 ISIS 邻居提供以下数据:

0192.0168.0001,state,hostname,ipv4Address
0192.0168.0002,state,hostname,ipv4Address
{
  "vrfs": {
    "default": {
      "isisInstances": {
        "XXX": {
          "neighbors": {
            "0192.0168.0001": {
              "adjacencies": [
                {
                  "state": "up",
                  "circuitId": "01",
                  "routerIdV4": "0.0.0.0",
                  "interfaceName": "Port-Channel1",
                  "lastHelloTime": 1651827049,
                  "level": "level-2",
                  "snpa": "P2P",
                  "hostname": "paris",
                  "details": {
                    "stateChanged": 1651599426,
                    "grSupported": "Supported",
                    "interfaceAddressFamily": "ipv4",
                    "srEnabled": false,
                    "advertisedHoldTime": 27,
                    "ip4Address": "192.168.0.1",
                    "neighborAddressFamily": "ipv4",
                    "areaIds": [
                      "00.0000"
                    ],
                    "bfdIpv4State": "adminDown",
                    "bfdIpv6State": "adminDown",
                    "grState": ""
                  }
                }
              ]
            },
            "0192.0168.0002": {
              "adjacencies": [
                {
                  "state": "up",
                  "circuitId": "00",
                  "routerIdV4": "0.0.0.0",
                  "interfaceName": "Port-Channel2",
                  "lastHelloTime": 1651827050,
                  "level": "level-2",
                  "snpa": "P2P",
                  "hostname": "london",
                  "details": {
                    "stateChanged": 1651599433,
                    "grSupported": "Supported",
                    "interfaceAddressFamily": "ipv4",
                    "srEnabled": false,
                    "advertisedHoldTime": 30,
                    "ip4Address": "192.168.0.2",
                    "neighborAddressFamily": "ipv4",
                    "areaIds": [
                      "00.0000"
                    ],
                    "bfdIpv4State": "adminDown",
                    "bfdIpv6State": "adminDown",
                    "grState": ""
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}

以下代码片段将为您提供所需的输出,但我们鼓励您下次先自己尝试,然后就您尝试的代码向我们寻求帮助。

import json

d = json.loads('''
{
  "vrfs": {
    "default": {
      "isisInstances": {
        "XXX": {
          "neighbors": {
            "0192.0168.0001": {
              "adjacencies": [
                {
                  "state": "up",
                  "circuitId": "01",
                  "routerIdV4": "0.0.0.0",
                  "interfaceName": "Port-Channel1",
                  "lastHelloTime": 1651827049,
                  "level": "level-2",
                  "snpa": "P2P",
                  "hostname": "paris",
                  "details": {
                    "stateChanged": 1651599426,
                    "grSupported": "Supported",
                    "interfaceAddressFamily": "ipv4",
                    "srEnabled": false,
                    "advertisedHoldTime": 27,
                    "ip4Address": "192.168.0.1",
                    "neighborAddressFamily": "ipv4",
                    "areaIds": [
                      "00.0000"
                    ],
                    "bfdIpv4State": "adminDown",
                    "bfdIpv6State": "adminDown",
                    "grState": ""
                  }
                }
              ]
            },
            "0192.0168.0002": {
              "adjacencies": [
                {
                  "state": "up",
                  "circuitId": "00",
                  "routerIdV4": "0.0.0.0",
                  "interfaceName": "Port-Channel2",
                  "lastHelloTime": 1651827050,
                  "level": "level-2",
                  "snpa": "P2P",
                  "hostname": "london",
                  "details": {
                    "stateChanged": 1651599433,
                    "grSupported": "Supported",
                    "interfaceAddressFamily": "ipv4",
                    "srEnabled": false,
                    "advertisedHoldTime": 30,
                    "ip4Address": "192.168.0.2",
                    "neighborAddressFamily": "ipv4",
                    "areaIds": [
                      "00.0000"
                    ],
                    "bfdIpv4State": "adminDown",
                    "bfdIpv6State": "adminDown",
                    "grState": ""
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}
''')

neighbors = d['vrfs']['default']['isisInstances']['XXX']['neighbors']

for neighbor in neighbors:
    adjacencies = neighbors[neighbor]['adjacencies']
    for adjacency in adjacencies:
        print(f"{neighbor},{adjacency['state']},{adjacency['hostname']},{adjacency['details']['ip4Address']}")

以上代码将导致:

0192.0168.0001,up,paris,192.168.0.1
0192.0168.0002,up,london,192.168.0.2