Luke
Luke

Reputation: 623

Python JSON unhashable type: 'dict'

I am creating a Python script to parse the JSON response from https://vulners.com/api/v3/search/stats/

I have the following code in my .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)

I need to get the vuln_type aswell as the child information (vuln_bulletinfamily & vuln_name) An excerpt from the JSON response:

"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"
  },

I am getting an error of TypeError: unhashable type: 'dict'

Traceback:

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'

Upvotes: 1

Views: 5672

Answers (2)

Guillain
Guillain

Reputation: 7

vuln_set = json.loads(response.text) vs response.json()

Upvotes: 0

Tushar Aggarwal
Tushar Aggarwal

Reputation: 837

In the traceback line, the next line and the first print line, you are trying to access a dict type_results and vuln_type with a key that is also a dictionary. You need to loop through the keys, like:-

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)

Upvotes: 1

Related Questions