Python中最好用的json庫orjson用法詳解
1 簡介
大傢好,我們在日常使用 Python 的過程中,經常會使用 json 格式存儲一些數據,尤其是在 web 開發中。而 Python 原生的 json 庫性能差、功能少,隻能堪堪應對簡單輕量的 json 數據存儲轉換需求。
而本文我要給大傢介紹的第三方 json 庫 orjson ,在公開的各項基準性能測試中,以數倍至數十倍的性能優勢碾壓 json 、 ujson 、 rapidjson 、 simplejson 等其他 Python 庫,且具有諸多額外功能,下面我們就來領略其常用方法吧~
2 orjson常用方法
orjson 支持 3.7 到 3.10 所有版本64位的 Python ,本文演示對應的 orjson 的版本為 3.7.0 ,直接使用 pip install -U orjson 即可完成安裝。下面我們來對 orjson 中的常用方法進行演示:
2.1 序列化
與原生 json 庫類似,我們可以使用 orjson.dumps() 將 Python 對象序列化為 JSON 數據,註意,略有不同的是, orjson 序列化的結果並不是 str 型而是 bytes 型,在下面的例子中,我們對包含一千萬個簡單字典元素的列表進行序列化, orjson 與 json 庫的耗時比較如下:
2.2 反序列化
將 JSON 數據轉換為 Python 對象的過程我們稱之為反序列化,使用 orjson.loads()
進行操作,可接受 bytes 、 str 型等常見類型,在前面例子的基礎上我們添加反序列化的例子:
2.3 豐富的option選項
在 orjson 的序列化操作中,可以通過參數 option 來配置諸多額外功能,常用的有:
- OPT_INDENT_2
通過配置 option=orjson.OPT_INDENT_2
,我們可以為序列化後的 JSON 結果添加2個空格的縮進美化效果,從而彌補其沒有參數 indent 的不足:
- OPT_OMIT_MICROSECONDS
orjson.dumps()
可以直接將 Python 中 datetime 、 time 等標準庫中的日期時間對象轉換成相應的字符串,這是原生 json 庫做不到的,而通過配置 option=orjson.OPT_OMIT_MICROSECONDS
,可以將轉換結果後綴的毫秒部分省略掉:
- OPT_NON_STR_KEYS
當需要序列化的對象存在非數值型鍵時, orjson 默認會拋出 TypeError 錯誤,這時需要配置 option=orjson.OPT_NON_STR_KEYS
來強制將這些鍵轉換為字符型:
OPT_SERIALIZE_NUMPY
orjson 的一大重要特性是其可以將包含 numpy 中數據結構對象的復雜對象,兼容性地轉換為 JSON 中的數組,配合 option=orjson.OPT_SERIALIZE_NUMPY
即可:
- OPT_SERIALIZE_UUID
除瞭可以自動序列化 numpy 對象外, orjson 還支持對 UUID 對象進行轉換,在 orjson 3.0
之前的版本中,需要配合 option=orjson.OPT_SERIALIZE_UUID
,而本文演示的 3.X
版本則無需額外配置參數:
- OPT_SORT_KEYS
通過配合參數 option=orjson.OPT_SORT_KEYS
,可以對序列化後的結果自動按照鍵進行排序:
- 組合多種option
當你的序列化操作需要涉及多種 option 功能時,則可以使用 | 運算符來組合多個 option 參數即可:
2.4 針對dataclass、datetime添加自定義處理策略
當你需要序列化的對象中涉及到 dataclass 自定義數據結構時,可以配合 orjson.OPT_PASSTHROUGH_DATACLASS
,再通過對 default 參數傳入自定義處理函數,來實現更為自由的數據轉換邏輯,譬如下面簡單的例子中,我們可以利用此特性進行原始數據的脫敏操作:
類似的,針對 datetime 類型數據,我們同樣可以配合 OPT_PASSTHROUGH_DATETIME
和自定義 default 函數實現日期自定義格式化轉換:
總結
到此這篇關於Python中最好用的json庫orjson用法的文章就介紹到這瞭,更多相關Python中json庫orjson內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python如何把不同類型數據的json序列化
- Python3內置json模塊編碼解碼方法詳解
- Python序列化模塊之pickle與json詳解
- Python常用標準庫詳解(pickle序列化和JSON序列化)
- Python中json.load()和json.loads()有哪些區別