JSON 模組

有關包含特定於版本的功能的完整文件,請檢視官方文件

型別

預設

json 模組預設處理以下型別的編碼和解碼:

反序列化型別:

JSON Python
賓語 字典
排列 名單
字串 海峽
數字(int) INT
數字(真實) float
真假 真假
空值 沒有

json 模組還將 NaNInfinity-Infinity 理解為相應的浮點值,這超出了 JSON 規範。

序列化型別:

Python JSON
字典 賓語
列表,元組 排列
海峽 字串
int,float,(int / float)-derived Enums
真正 真正
沒有 空值

要禁止對 NaNInfinity-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.JSONEncoderjson.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)