以良好的方式解析 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
我有一些 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