JSON(JavaScript Object Notation)是一个受 JavaScript 的对象字面量语法启发的轻量级数据交换格式。尽管 JSON 是 JavaScript 的一个子集,但 JSON 是独立于语言的文本格式。用 JSON 格式描述的数据,可读性很强,其书写格式非常类似于字典,字段名称和值之间用冒号隔开,即“字段名称:值”。
作为 Python 的一个第三方包名,JSON 要用全部小写的形式,即 json。json 提供了与标准库 marshal 和 pickle 相似的 API 接口。
Python dumps与loads
在 Python 3.x 中,可以使用 json 模块来对 JSON 数据进行编解码,它包含了如下两个函数。
json.dumps():将 Python 对象序列化(即编码)为 JSON 格式的字符串。
json.loads():将 JSON 格式的字符串反序列化(即解码)为 Python 对象。
“dumps”的本意是“倾倒”,这里表示内存信息的转储,它可以把 Python 的原始类型(如字典、列表等)向JSON类型转换;“loads”的本意是“装载”,这里表示把 JSON 类型变换为 Python 的原始数据类型。
【例 1】利用 json 模块实现序列化(dumps-json.py)
import json #导入 json 模块
data = { #定义一个字典 data
'name':'ACME',
'shares':100,
'price':542.23
}
json_str = json.dumps(data) #将字典 data 序列化为 JOSN 对象
print(json_str)
程序执行结果为:
{"name":"ACME", "shares":100, "price":542.23}
查看第 07 行,序列化的 JSON 对象在本质上就是字符串,所以我们可以用 print( ) 直接输出结果(第 08 行)。
我们也可以将一个 JSON 编码的字符串转换为一个 Python 数据类型,方法如下:
data1 = json.loads(json_str) #反序列化
print(datal)
程序执行结果为:
{'name':'ACME', 'shares':100, 'price':542.23}
我们可以用 type( ) 方法来查看 data1 的类型,如下:
type(data)
程序执行结果为:
dict
由运行结果可以看出,第 09 行代码成功将一个 JSON 字符串对象反序列化(解码)为一个字典类型。
Python dump与load
如果我们要处理的是文件而不是字符串,则可以使用 json.dump( ) 和 json.load( ) 来编码和解码 JSON 数据(即动词 dump 和 load 后面没有字母 s),如例 2 所示。
【例 2】将列表保持到 json 文件中(json-file.py)
import json
#从列表中打包
data2 = [ { 'a': 1, 'b': 2,
'c': 3, 'd': 4,
'e': 5 }]
#将数据保存到JSON文件中
with open('data.json','w') as f:
json.dump(daf)
运行上述代码之后,在 json-file.py 相同文件夹下将会出现一个 JSON 文件 data.json,如图 1 所示。
图 1:JSON 文件
代码的第 03~05 行定义了一个列表,列表中有一个元素:一个含有多个键/值对的字典。第 07 行利用 open( ) 函数创建了一个文件对象,并取了一个别名为 f。这里利用了 with 语句上下文管理器,执行 with 语句块后,系统会自动进行资源清理,针对上面的例子而言就是,执行 with 语句块后,Python 系统会自动关闭文件。
类似地,我们可以使用 json.load( ) 把数据从 JSON 文件中读取出来,代码如下:
#将数据从JSON文件中读取出来
with open('data.json', 'r ') as f:
data3 = json.load(f)
我们可以把 data3 中的字典信息读取出来,方法如下:
print(data3[0])
程序执行结果如下:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
对比图 1 和上面的输出可以发现,JSON 编码格式和 Python 内置的字典类型几乎一样,也有一些细小差异。比如,Python 中的 True 会被映射为 true,False 会被映射为 false,而 None 会被映射为 null。