如何将字典中嵌套的 numpy 数组转换为 JSON?
How to convert nested numpy arrays in a dictionary to JSON?
我正在解析嵌套字典,它们具有不同程度的嵌套(字典中的字典中的字典等)我事先不知道字典的嵌套程度。
问题是,某些字典值是 numpy.ndarrays
。当我尝试用
将字典 my_dictionary
写入 JSON 时
with open(my_dictionary, 'w') as f:
json.dump(my_dictionary, f, indent=4)
我会得到以下错误:
TypeError: Object of type ndarray is not JSON serializable
自然地,解决这个问题的一种方法是简单地将所有 numpy.ndarray
值转换为包含 .tolist()
.
的列表
但是,鉴于我不知道字典的嵌套程度,我如何通过算法检查任何嵌套字典的所有值并将 ndarray
转换为列表?
或者有其他方法可以克服这个错误吗?
您可以自定义 json.JSONEncoder
。例如:
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))
打印:
{
"data": [
{
"obj": [
1,
2,
3
]
}
]
}
我正在解析嵌套字典,它们具有不同程度的嵌套(字典中的字典中的字典等)我事先不知道字典的嵌套程度。
问题是,某些字典值是 numpy.ndarrays
。当我尝试用
my_dictionary
写入 JSON 时
with open(my_dictionary, 'w') as f:
json.dump(my_dictionary, f, indent=4)
我会得到以下错误:
TypeError: Object of type ndarray is not JSON serializable
自然地,解决这个问题的一种方法是简单地将所有 numpy.ndarray
值转换为包含 .tolist()
.
但是,鉴于我不知道字典的嵌套程度,我如何通过算法检查任何嵌套字典的所有值并将 ndarray
转换为列表?
或者有其他方法可以克服这个错误吗?
您可以自定义 json.JSONEncoder
。例如:
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))
打印:
{
"data": [
{
"obj": [
1,
2,
3
]
}
]
}