解決TypeError: Object of type xxx is not JSON serializable錯誤問題
TypeError: Object of type xxx is not JSON serializable
問題描述
在導(dǎo)入Python json包,調(diào)用json.dump/dumps函數(shù)時,可能會遇到TypeError: Object of type xxx is not JSON serializable錯誤,也就是無法序列化某些對象格式。
解決辦法
默認(rèn)的編碼函數(shù)很多數(shù)據(jù)類型都不能編碼,自定義序列化,因此可以自己寫一個Myencoder去繼承json.JSONEncoder
具體如下:
class MyEncoder(json.JSONEncoder): ? ? def default(self, obj): ? ? ? ? if isinstance(obj, np.integer): ? ? ? ? ? ? return int(obj) ? ? ? ? elif isinstance(obj, np.floating): ? ? ? ? ? ? return float(obj) ? ? ? ? elif isinstance(obj, np.ndarray): ? ? ? ? ? ? return obj.tolist() ? ? ? ? else: ? ? ? ? ? ? return super(MyEncoder, self).default(obj)
然后在調(diào)用json.dump/dumps時,指定使用自定義序列化方法
json.dumps(data, cls=MyEncoder)?
dict to json
def dict_to_json(dict_obj,name, Mycls = None): ? ? js_obj = json.dumps(dict_obj, cls = Mycls, indent=4) ? ? with open(name, 'w') as file_obj: ? ? ? ? file_obj.write(js_obj)
json to dict
def json_to_dict(filepath, Mycls = None): ? ? with open(filepath,'r') as js_obj: ? ? ? ? dict_obj = json.load(js_obj, cls = Mycls) ? ? return dict_obj
TypeError: Object of type ‘int64’ is not JSON serializable (或者float32)
在使用json格式保存數(shù)據(jù)時,經(jīng)常會遇到xxx is not JSON serializable,也就是無法序列化某些對象格式,我所遇見的是我使用了numpy時,使用了np的數(shù)據(jù)格式,寫入data后,json.dumps(data)失敗,我們可以自己定定義對特定類型的對象的序列化
下面看下怎么定義和使用關(guān)于np數(shù)據(jù)類型的自定義。
1.首先,繼承json.JSONEncoder,自定義序列化方法。
class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) elif isinstance(obj, np.floating): return float(obj) elif isinstance(obj, np.ndarray): return obj.tolist() else: return super(NpEncoder, self).default(obj)
2.使用dumps方法(我們可以直接把dict直接序列化為json對象)加上 cls=NpEncoder,data就可以正常序列化了
json.dumps(data, cls=NpEncoder)
其實,很簡單,自定義一個序列化方法,然后dumps的時候加上cls=NpEncoder
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)telnet服務(wù)器的方法
這篇文章主要介紹了Python實現(xiàn)telnet服務(wù)器的方法,涉及Python通過Telnet連接服務(wù)器的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07Python?PaddleGAN實現(xiàn)調(diào)整照片人物年齡
這篇文章主要介紹了通過PaddleGAN實現(xiàn)照片人物的老年化和年輕化處理,文中的示例代碼講解有效,對我們學(xué)習(xí)或工作有一定的幫助,感興趣的可以學(xué)習(xí)一下2021-12-12Python成功解決ZeroDivisionError:?division?by?zero的方法過程
在Python編程中,ZeroDivisionError:divisionbyzero是因為嘗試除以零所導(dǎo)致的常見錯誤,這篇文章詳細(xì)介紹了錯誤的原因、解決方案,需要的朋友可以參考下2024-09-09Python光學(xué)仿真從Maxwell方程組到波動方程矢量算法理解學(xué)習(xí)
這篇文章主要為大家介紹了Python光學(xué)仿真從Maxwell方程組到波動方程算法的理解學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10django框架實現(xiàn)模板中獲取request 的各種信息示例
這篇文章主要介紹了django框架實現(xiàn)模板中獲取request 的各種信息,結(jié)合實例形式分析了Django框架模板直接獲取request信息的相關(guān)配置與操作技巧,需要的朋友可以參考下2019-07-07Python常用算法學(xué)習(xí)基礎(chǔ)教程
這篇文章主要學(xué)習(xí)Python常用算法,Python常用排序算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一2017-04-04Python?OpenCV超詳細(xì)講解讀取圖像視頻和網(wǎng)絡(luò)攝像頭
OpenCV用C++語言編寫,它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實時視覺應(yīng)用,并在可用時利用MMX和SSE指令,本篇文章帶你了解OpenCV讀取圖像視頻與網(wǎng)絡(luò)攝像頭的方法2022-04-04