【发布时间】:2020-05-28 13:34:34
【问题描述】:
我在尝试访问一些嵌套的 JSON 数据时遇到一个关键错误,这是因为我正在努力打印 ["updates"] 下的第二组数据,请参见下面的代码:
for url in URLs:
JSONdata = requests.get(url, cookies=cookies, verify=False) .json()
notifications = JSONdata["notifications"]
for JSONkey in notifications:
outDiscards = JSONkey["updates"]["outDiscards"]["value"]["avg"]["float"]
inDiscards = JSONkey["updates"]["inDiscards"]["value"]["avg"]["float"]
name = JSONkey["path_elements"][1]
interface = JSONkey["path_elements"][5]
print(name, interface, outDiscards, inDiscards, sep=',')
JSON 数据看起来像这样,我正在尝试访问键 ["outDiscards]" 的 AVG 浮点数(一直滚动到底部以找到它):
{
"notifications": [
{
"timestamp": "1590228300000000000",
"path_elements": [
"Devices",
"ASDASDA23",
"versioned-data",
"interfaces",
"data",
"Ethernet6",
"aggregate",
"rates",
"1m"
],
"updates": {
"alignmentErrors": {
"key": "alignmentErrors",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"fcsErrors": {
"key": "fcsErrors",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"frameTooLongs": {
"key": "frameTooLongs",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"frameTooShorts": {
"key": "frameTooShorts",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"inDiscards": {
"key": "inDiscards",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"inErrors": {
"key": "inErrors",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"outErrors": {
"key": "outErrors",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
},
"symbolErrors": {
"key": "symbolErrors",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
}
}
},
{
"timestamp": "1590672660000000000",
"path_elements": [
"Devices",
"ASDASDA23",
"versioned-data",
"interfaces",
"data",
"Ethernet6",
"aggregate",
"rates",
"1m"
],
"updates": {
"inOctets": {
"key": "inOctets",
"value": {
"avg": {
"float": 2252589.403482577
},
"max": {
"float": 3062029.5123118195
},
"min": {
"float": 1716651.1165519762
},
"stddev": {
"float": 486507.3457503787
},
"weight": {
"float": 0.9999999999999999
}
}
},
"inUcastPkts": {
"key": "inUcastPkts",
"value": {
"avg": {
"float": 4924.985636262933
},
"max": {
"float": 6405.247375228221
},
"min": {
"float": 4027.16222744576
},
"stddev": {
"float": 856.3274693923914
},
"weight": {
"float": 0.9999999999999999
}
}
},
"outMulticastPkts": {
"key": "outMulticastPkts",
"value": {
"avg": {
"float": 0.03331537922781352
},
"max": {
"float": 0.09996021185548479
},
"min": {
"float": 0
},
"stddev": {
"float": 0.047115061840280935
},
"weight": {
"float": 0.9999999999999999
}
}
},
"outOctets": {
"key": "outOctets",
"value": {
"avg": {
"float": 532952.2820988153
},
"max": {
"float": 686277.7896707873
},
"min": {
"float": 453320.58138715214
},
"stddev": {
"float": 80364.91411229585
},
"weight": {
"float": 0.9999999999999999
}
}
},
"outUcastPkts": {
"key": "outUcastPkts",
"value": {
"avg": {
"float": 4409.95750691497
},
"max": {
"float": 5605.478585933741
},
"min": {
"float": 3652.11719308749
},
"stddev": {
"float": 677.6427171449172
},
"weight": {
"float": 0.9999999999999999
}
}
}
}
},
{
"timestamp": "1590444480000000000",
"path_elements": [
"Devices",
"ASDASDA23",
"versioned-data",
"interfaces",
"data",
"Ethernet6",
"aggregate",
"rates",
"1m"
],
"updates": {
"outDiscards": {
"key": "outDiscards",
"value": {
"avg": {
"float": 0
},
"max": {
"float": 0
},
"min": {
"float": 0
},
"stddev": {
"float": 0
},
"weight": {
"float": 1
}
}
}
}
},
我不断收到 KeyError,这是因为如果我只打印 ["updates"] 它只会上升到 JSON 数据中的 "SymbolErrors",因为它以 ))) 结束,我不知道如何访问数据的第二部分
【问题讨论】:
-
.get("inDiscards" or "outDiscards")并不像你认为的那样做,它和.get("inDiscards")一样。 -
好的,我已经删除了这个并更新了上面的代码
-
所以,
notifications包含一个对象数组。并非每个对象都包含updates中的相同键。所以你需要有条件地访问那些,例如if 'outDiscards' in JSONkey['updates']: .... -
我已经测试了一遍又一遍,关键错误会自己产生
-
嗯,是的……因为当这个特定的
JSONkey没有["updates"]["outDiscards"]键时,你天真地访问了JSONkey["updates"]["outDiscards"]……
标签: python json python-3.x python-requests