Object of type ndarray is not JSON serializable 和 Object of type bool_ is not JSON serializable

python中通过json保存字典数据文件时候会报错TypeError: Object of type *** is not JSON serializable,最初是ndarray的问题,然后转为list后,list中的值为bool_类型,还是会报错,注意是bool_而不是boolbool类型的话不会报错!!!!!两者有啥区别目前还不确定,利用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_listdict_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")
上面能正常保存!如果打印dict_list_bool中每一个值中的每一个元素类型为bool!

问题解决了,但是bool_具体是什么类型,希望有明白的大佬说一下!bool_能够通过if进行正常的条件判断。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值