【问题标题】:JSON Data producing key error for nested dataJSON数据产生嵌套数据的关键错误
【发布时间】: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


【解决方案1】:

inDiscardsoutDiscards 并非在您拥有的每个 updates 中,.get("inDiscards" or "outDiscards") 不会做您认为可以做的事情。

只需查看updates dict,您会发现inDiscardsoutDiscards 不在一个更新字典中。

【讨论】:

  • 我已经删除了这个,更新了上面的代码,但仍然得到相同的 KeyError
【解决方案2】:

Outdiscards 的位置不断变化,我使用 try 和 except 方法解决了这个问题并访问了正确的索引

    inDiscards = JSONkey[0]["updates"]["inDiscards"]["value"]["avg"]["float"]
    name = JSONkey[1]["path_elements"][1]
    interface = JSONkey[1]["path_elements"][5]
    try:
        outDiscards = JSONkey[0]["updates"]["outDiscards"]["value"]["avg"]["float"]
        # print(inDiscards, outDiscards)
    except KeyError:
        outDiscards = JSONkey[2]["updates"]["outDiscards"]["value"]["avg"]["float"]
        # print(inDiscards, outDiscards)

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2016-01-27
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多