python中通过json保存字典数据文件时候会报错TypeError: Object of type *** is not JSON serializable,最初是ndarray的问题,然后转为list后,list中的值为bool_类型,还是会报错,注意是bool_
而不是bool
,bool
类型的话不会报错!!!!!两者有啥区别目前还不确定,利用bool()
转换一下每个元素就没问题了。具体介绍如下:
json.dumps() 报错 TypeError: Object of type ndarray is not JSON serializable
import json
import numpy as np
def save_layer_size_as_json(layer_sizes, json_file):
json_object = json.dumps(layer_sizes)
with open(json_file,'w') as f:
f.write(json_object)
dict_ndarray = {}
dict_ndarray['layer1'] = np.array([True,False])
dict_ndarray['layer2'] = np.array([True,False])
save_layer_size_as_json(dict_ndarray,"result.json")
上面会报错TypeError: Object of type ndarray is not JSON serializable
,然后通过list()将字典的每个value转换为list。
print(dict_ndarray)
dict_list = {}
for key in dict_ndarray:
dict_list[key] = list(dict_ndarray[key])
print(dict_list)
save_layer_size_as_json(dict_list,"result.json")
打印下面内容并报错TypeError: Object of type bool_ is not JSON serializable
开始以为数据类型不能为bool
:
{'layer1': array([ True, False]), 'layer2': array([ True, False])}
{'layer1': [True, False], 'layer2': [True, False]}
但是直接将上面打印的第二行赋值给字典,却不会报错。
dict_hand = {'layer1': [True, False], 'layer2': [True, False]}
save_layer_size_as_json(dict_hand,"result.json")
上面能正常保存!继续查找问题,通过报错前面的具体信息raise TypeError(f'Object of type {o.__class__.__name__}
查看得知是类型问题,打印dict_list
和dict_hand
的值中的每个元素类型:
print(dict_list["layer1"][0].__class__.__name__)
print(dict_hand["layer1"][0].__class__.__name__)
上面输出为:
bool_
bool
看到了两个区别,一个类型后右下划线,一个没有,这就是问题所在,将每一个元素通过bool()进行转换后,则正常!
dict_list_bool = {}
for key in dict_ndarray:
dict_list_bool[key] = []
for ii in list(dict_ndarray[key]):
dict_list_bool[key].append(bool(ii))
save_layer_size_as_json(dict_list_bool,"result.json")