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)