Dealing With a TypeError in Python 3
When I finally upgraded to Python 3, I realized that one of my scripts that writes JSON to a file no longer works. Read on to find out how I resolved it.
Join the DZone community and get the full member experience.
Join For FreeI recently upgraded to Python 3 (I know, took me a while!) and realized 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!
Published at DZone with permission of Mark Needham, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments