I’m parsing nested dictionaries, which have different degrees of how nested they are (dictionaries within dictionaries within dictionaries, etc.) I do not know beforehand to what degree the dictionaries are nested.
The problem is, certain dictionary values are numpy.ndarrays. When I try to write the dictionary my_dictionary to JSON with
with open(my_dictionary, 'w') as f:
json.dump(my_dictionary, f, indent=4)
I will get the following error:
TypeError: Object of type ndarray is not JSON serializable
Naturally, one way to overcome this would be to simply convert all numpy.ndarray values into a list with .tolist().
However, given I do not know how nested the dictionaries are, how could I algorithmically check all values of any nested dictionary and convert ndarray to list?
Or is there another way to overcome this error?
Advertisement
Answer
You can make custom json.JSONEncoder. For example:
import json
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.ndarray):
return obj.tolist()
return json.JSONEncoder.default(self, obj)
data = {"data": [{"obj": np.array([1, 2, 3])}]}
print(json.dumps(data, cls=MyEncoder, indent=4))
Prints:
{
"data": [
{
"obj": [
1,
2,
3
]
}
]
}