Reputation: 1858
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?
Upvotes: 2
Views: 355
Reputation: 195478
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
]
}
]
}
Upvotes: 3