Python数据持久性 JSON模块
JSON是 JavaScript Object Notation的缩写。 它是一种轻量级的数据交换格式。它是一种独立于语言和跨平台的文本格式,被许多编程语言支持。这种格式用于网络服务器和客户端之间的数据交换。
JSON格式与pickle类似。然而,pickle的序列化是Python特有的,而JSON格式被许多语言实现,因此已经成为普遍的标准。Python标准库中的json模块的功能和界面与pickle和marshal模块相似。
就像pickle模块一样,json模块也提供了 dumps() 和 load() 函数,用于将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类是由JSONncoder()构造函数实例化的。以下是编码器类中定义的重要方法
序号 | 方法和描述 |
---|---|
1 | encode() 将Python对象序列化为JSON格式。 |
2 | iterencode() 对对象进行编码,并返回一个迭代器,产生对象中每个项目的编码形式。 |
3 | indent 决定编码后的字符串的缩进程度 |
4 | sort_keys 为true或false,以使键值按排序顺序出现或不出现。 |
5 | Check_circular 如果为真,检查容器类型对象中的循环引用。 |
下面的例子是对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
]
}
]