Python 数据持久化 - JSON 模块
JSON 代表 JavaScript 对象表示法。 它是一种轻量级的数据交换格式。 它是一种独立于语言的跨平台文本格式,受到许多编程语言的支持。 此格式用于 Web 服务器和客户端之间的数据交换。
JSON格式类似于pickle。 然而,pickle 序列化是 Python 特定的,而 JSON 格式被许多语言实现,因此已成为通用标准。 Python 标准库中的 json 模块的功能和接口类似于 pickle 和 marshal 模块。
与pickle模块一样,json模块也提供了dumps()和loads()函数,用于将Python对象序列化为JSON编码字符串, dump() 和 load() 函数在文件中写入和读取序列化的 Python 对象。
dumps() − 此函数将对象转换为 JSON 格式。
loads() − 此函数将 JSON 字符串转换回 Python 对象。
以下示例演示了这些函数的基本用法 −
import json data=['Rakesh',{'marks':(50,60,70)}] s=json.dumps(data) json.loads(s)
dumps() 函数可以采用可选的 sort_keys 参数。 默认情况下,它是 False。 如果设置为 True,字典键将按排序顺序出现在 JSON 字符串中。
dumps() 函数有另一个可选参数 indent,它接受一个数字作为值。 它决定了 json 字符串格式化表示的每一段的长度,类似于打印输出。
json 模块也有对应上述功能的面向对象API。 模块中定义了两个类——JSONEncoder 和 JSONDecoder。
JSONEncoder 类
这个类的对象是 Python 数据结构的编码器。 每种 Python 数据类型转换为相应的 JSON 类型,如下表所示 −
Python | JSON |
---|---|
Dict | object |
list, tuple | array |
Str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
JSONEncoder 类由 JSONEncoder() 构造函数实例化。 编码器类中定义了以下重要方法 −
序号 | 方法与说明 |
---|---|
1 |
encode() 将 Python 对象序列化为 JSON 格式 |
2 |
iterencode() 对对象进行编码并返回一个迭代器,该迭代器生成对象中每个项目的编码形式。 |
3 |
indent 确定编码字符串的缩进级别 |
4 |
sort_keys 为 true 或 false 使键是否按排序顺序出现。 |
5 |
Check_circular 如果为 True,检查容器类型对象中的循环引用 |
以下示例对 Python 列表对象进行编码。
e=json.JSONEncoder() e.encode(data)
JSONDecoder 类
此类的对象有助于将 json 字符串解码回 Python 数据结构。 此类中的主要方法是 decode()。 以下示例代码从前面步骤中的编码字符串中检索 Python 列表对象。
d=json.JSONDecoder() d.decode(s)
json 模块定义了 load() 和 dump() 函数来将 JSON 数据写入一个类似对象的文件——它可以是一个磁盘文件或一个字节流,并且从他们那里读回数据。
dump()
此函数将 JSON 化的 Python 对象数据写入文件。 该文件必须以"w"模式打开。
import json data=['Rakesh', {'marks': (50, 60, 70)}] fp=open('json.txt','w') json.dump(data,fp) fp.close()
此代码将在当前目录中创建"json.txt"。 显示内容如下 −
["Rakesh", {"marks": [50, 60, 70]}]
load()
此函数从文件中加载 JSON 数据并从中返回 Python 对象。 文件必须以读取权限打开(应该以"r"模式)。
示例
fp=open('json.txt','r') ret=json.load(fp) print (ret) fp.close()
输出
['Rakesh', {'marks': [50, 60, 70]}]
json.tool 模块还有一个命令行界面,可以验证文件中的数据并以一种格式良好的方式打印 JSON 对象。
C:\python37>python -m json.tool json.txt [ "Rakesh", { "marks": [ 50, 60, 70 ] } ]