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)