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)