【问题标题】:Python JSON unhashable type: 'dict'Python JSON 不可散列类型:'dict'
【发布时间】:2020-08-21 14:17:35
【问题描述】:

我正在创建一个 Python 脚本来解析来自 https://vulners.com/api/v3/search/stats/ 的 JSON 响应

我的 .py 中有以下代码:

import json
import requests

response = requests.get('https://vulners.com/api/v3/search/stats/')
vuln_set = json.loads(response.text)

vuln_type = vuln_set['data']['type_results']
vuln_bulletinfamily = vuln_set['data']['type_results'][vuln_type]['bulletinFamily']
vuln_name = vuln_set['data']['type_results'][vuln_type]['displayName']

print("Type: " + vuln_type)
print("Bulletin Family: " + vuln_bulletinfamily)
print("Name: " + vuln_name)

我需要获取 vuln_type 以及孩子信息 (vuln_bulletinfamily & vuln_name) JSON 响应的摘录:

"data": {
"type_results": {
  "aix": {
    "lastUpdated": [],
    "bulletinFamily": "unix",
    "displayName": "IBM AIX",
    "lastrun": "2017-09-14T14:04:56",
    "count": 110,
    "workTime": "0:00:10.983795"
  },
  "akamaiblog": {
    "lastUpdated": [],
    "bulletinFamily": "blog",
    "displayName": "Akamai Blog",
    "lastrun": "2017-09-14T10:38:52",
    "count": 1463,
    "workTime": "0:00:00.358691"
  },
  "amazon": {
    "lastUpdated": [],
    "bulletinFamily": "unix",
    "displayName": "Amazon Linux AMI",
    "lastrun": "2017-09-14T14:17:40",
    "count": 889,
    "workTime": "0:00:01.839594"
  },

我收到 TypeError: unhashable type: 'dict' 的错误

追溯:

Traceback (most recent call last):
File "test.py", line 9, in <module>
vuln_bulletinfamily = vuln_set['data']['type_results'][vuln_type]['bulletinFamily']
TypeError: unhashable type: 'dict'

【问题讨论】:

  • 密钥必须是可散列的。作为一般规则,只有不可变对象(字符串、整数、浮点数、冻结集、不可变元组)是可散列的(尽管可能有例外)。
  • 我已经在上面添加了回溯
  • 您正在传递要作为字典键查找的字典。 vuln_type = vuln_set['data']['type_results'],它是一个字典尝试打印它。您需要从该字典中选择一个可能的键以继续深入到 bulletinFamily 的层次结构中。不太清楚你想做什么,也许你打算遍历type_results dict中的项目?
  • 这个 JSON 文件有很多 vuln_type 字典,所以我必须为每个重复代码吗?
  • vuln_bulletinfamily = vuln_set['data']['type_results'][vuln_type]['bulletinFamily'] - 在这一行中,vuln_type 是一个类型 dict,dict 键不能是 dicts。您需要遍历 vuln_type 中的每个键才能访问它们

标签: python json


【解决方案1】:

在回溯行、下一行和第一个打印行中,您尝试使用也是字典的键访问字典 type_resultsvuln_type。 您需要遍历键,例如:-

import json
import requests

response = requests.get('https://vulners.com/api/v3/search/stats/')
vuln_set = json.loads(response.text)

vuln_type = vuln_set['data']['type_results']
for k in vuln_type :
    vuln_bulletinfamily = vuln_set['data']['type_results'][k]['bulletinFamily']
    vuln_name = vuln_set['data']['type_results'][k]['displayName']

    print("Type: " + k)
    print("Bulletin Family: " + vuln_bulletinfamily)
    print("Name: " + vuln_name)

【讨论】:

  • 成功了!我几天前才开始使用python,来自PHP
【解决方案2】:
vuln_set = json.loads(response.text) vs response.json()

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多