Python 3: TypeError: Object of type 'dict_values' is not JSON serializable
I’ve recently upgraded to Python 3 (I know, took me a while!) and realised that one of my scripts that writes JSON to a file no longer works!
This is a simplified version of what I’m doing:
>>> import json
>>> x = {"mark": {"name": "Mark"}, "michael": {"name": "Michael"} }
>>> json.dumps(x.values())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'dict_values' is not JSON serializable
Python 2.7 would be perfectly happy:
>>> json.dumps(x.values())
'[{"name": "Michael"}, {"name": "Mark"}]'
The difference is in the results returned by the values method:
# Python 2.7.10
>>> x.values()
[{'name': 'Michael'}, {'name': 'Mark'}]
# Python 3.6.0
>>> x.values()
dict_values([{'name': 'Mark'}, {'name': 'Michael'}])
>>>
Python 3 no longer returns an array, instead we have a dict_values wrapper around the data.
Luckily this is easy to resolve - we just need to wrap the call to values with a call to list:
>>> json.dumps(list(x.values()))
'[{"name": "Mark"}, {"name": "Michael"}]'
This versions works with Python 2.7 as well so if I accidentally run the script with an old version the world isn’t going to explode.
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.