JSON 模組
有關包含特定於版本的功能的完整文件,請檢視官方文件 。
型別
預設
json 模組預設處理以下型別的編碼和解碼:
反序列化型別:
JSON |
Python |
|---|---|
| 賓語 | 字典 |
| 排列 | 名單 |
| 字串 | 海峽 |
| 數字(int) | INT |
| 數字(真實) | float |
| 真假 | 真假 |
| 空值 | 沒有 |
json 模組還將 NaN,Infinity 和 -Infinity 理解為相應的浮點值,這超出了 JSON 規範。
序列化型別:
Python |
JSON |
|---|---|
| 字典 | 賓語 |
| 列表,元組 | 排列 |
| 海峽 | 字串 |
| int,float,(int / float)-derived Enums | 數 |
| 真正 | 真正 |
| 假 | 假 |
| 沒有 | 空值 |
要禁止對 NaN,Infinity 和 -Infinity 進行編碼,必須使用 allow_nan=False 進行編碼。如果你嘗試對這些值進行編碼,則會產生一個 ValueError。
自定義(取消)序列化
有各種鉤子,允許你處理需要以不同方式表示的資料。functools.partial 的使用允許你將相關引數部分應用於這些功能以方便使用。
連載:
你可以提供一個在物件序列化之前對物件進行操作的函式,如下所示:
# my_json module
import json
from functools import partial
def serialise_object(obj):
# Do something to produce json-serialisable data
return dict_obj
dump = partial(json.dump, default=serialise_object)
dumps = partial(json.dumps, default=serialise_object)
反序列化:
json 函式處理各種鉤子,例如 object_hook 和 parse_float。有關你的 python 版本的詳盡列表,請參閱此處 。
# my_json module
import json
from functools import partial
def deserialise_object(dict_obj):
# Do something custom
return obj
def deserialise_float(str_obj):
# Do something custom
return obj
load = partial(json.load, object_hook=deserialise_object, parse_float=deserialise_float)
loads = partial(json.loads, object_hook=deserialise_object, parse_float=deserialise_float)
進一步定製(去)序列化:
json 模組還允許擴充套件/替換 json.JSONEncoder 和 json.JSONDecoder 以處理各種型別。通過建立等效命名的方法,可以將上面記錄的鉤子新增為預設值。要使用這些,只需將類作為 cls 引數傳遞給相關函式。使用 functools.partial 可以將 cls 引數部分應用於這些函式以方便使用,例如
# my_json module
import json
from functools import partial
class MyEncoder(json.JSONEncoder):
# Do something custom
class MyDecoder(json.JSONDecoder):
# Do something custom
dump = partial(json.dump, cls=MyEncoder)
dumps = partial(json.dumps, cls=MyEncoder)
load = partial(json.load, cls=MyDecoder)
loads = partial(json.loads, cls=MyDecoder)