Python 内建包-json

1. wiki

json 库实现序列化和反序列化

2. 使用

2.1. 序列化

2.1.1. dump

1
2
3
4
json.dump(obj, fp, *, 
skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None,
separators=None, default=None, sort_keys=False, **kw)

参数含义

  • obj : 表示是要序列化的对象
  • fp : 文件描述符,将序列化的 str 保存到文件中。其是需要支持 .write() 的类文件对象
  • skipkeys : 默认为 False ,如果为 True,那么那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过;否则引发一个 TypeError。
  • ensure_ascii : 默认值为 True,能将所有传入的非 ASCII 字符转义输出。否则这些字符将按原样输出
  • check_circular : 默认值为 True,如果为 False,那么容器类型的循环引用检验会被跳过并且循环引用会引发一个 OverflowError
  • allow_nan : 默认值为 True,如果为 False,那么在对严格 JSON 规格范围外的 float 类型值(nan、inf 和 -inf)进行序列化时会引发一个 ValueError。如果 allow_nan 是 true,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity)。
  • indent : 设置缩进格式,美化输出,默认值为 None。
    • 值为 None ,选择最紧凑的表示
    • 值为一个正整数,会让每一层缩进同样数量的空格
    • 值为一个字符串 (比如 “\t”),那个字符串会被用于缩进每一层
    • 值为为零、负数或者 “”,则只会添加换行符
  • separators : 去除分隔符后面的空格,默认值为 None。如果指定,则分隔符应为(item_separator,key_separator)元组。当 indent 为 None 时,默认值取 (', ', ': '),否则取 (',', ': ')。为了得到最紧凑的 JSON 表达式,你应该指定其为 (',', ':') 以消除空白字符。
  • default : 默认值为 None,如果指定,其为一个函数,每当某个对象无法被序列化时它会被调用。它应返回对象的 JSON 可编码版本或引发 TypeError。如果未指定,则引发 TypeError
  • sort_keys : 默认值为 False,如果为True,则字典的输出将按键值排序
  • cls : 为了使用一个自定义的 JSONEncoder 子类(比如:覆盖了 default() 方法来序列化额外的类型),通过该关键字参数来指定,否则将使用 JSONEncoder

2.1.2. dumps

dumps 函数不需要传文件描述符,其他的参数和 dump 函数的一样

2.2. 反序列化

2.2.1. load

1
2
3
4
json.load(fp, *, 
cls=None, object_hook=None,
parse_float=None, parse_int=None, parse_constant=None,
object_pairs_hook=None, **kw)

参数含义

  • fp : 文件描述符,将一个支持 .read() 并包含一个 JSON 文档的 text file 或者 binary file,反序列化为一个 Python 对象
  • object_hook : 默认值为 None,其是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象
  • parse_float : 默认值为 None,如果指定了,用来对 JSON float 字符串进行解码,这可用于为 JSON 浮点数使用另一种数据类型或解析器。默认状态下,相当于 float(num_str)
  • parse_int : 默认值为 None,如果指定了,用来对 JSON int 字符串进行解码,这可用于为 JSON 整数使用另一种数据类型或解析器。默认状态下,相当于 int(num_str)
  • parse_constant : 默认值为 None,如果指定了,将要与以下字符串中的一个一同调用:'-Infinity','Infinity','NaN'。如果遇到了无效的 JSON 符号,会引发异常。
  • object_pairs_hook : 默认值为 None,其是一个可选函数,用于实现自定义解码器,优先级比 object_hook

2.2.2. loads

loads 函数不需要传文件描述符,取而代之的是一个字符串的传入,其他参数的含义和 load 函数的一致,增加了需要字符集参数

  • s : 将 s(包含 JSON 文档的 str,bytes 或 bytearray 实例)反序列化为 Python 对象
  • encoding : 指定编码格式,默认值为 None

3. 举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import json

# 编码
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'
print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
"""
{
"4": 5,
"6": 7
}
"""
# 解码
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
# ['foo', {'bar': ['baz', None, 1.0, 2]}]