首页 > Python笔记 阅读数:55

Python JSON模块详解

JSON(JavaScript Object Notation)是一个受 JavaScript 的对象字面量语法启发的轻量级数据交换格式。尽管 JSON 是 JavaScript 的一个子集,但 JSON 是独立于语言的文本格式。用 JSON 格式描述的数据,可读性很强,其书写格式非常类似于字典,字段名称和值之间用冒号隔开,即“字段名称:值”。

作为 Python 的一个第三方包名,JSON 要用全部小写的形式,即 json。json 提供了与标准库 marshal 和 pickle 相似的 API 接口。

Python dumps与loads

在 Python 3.x 中,可以使用 json 模块来对 JSON 数据进行编解码,它包含了如下两个函数。

“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 所示。

JSON文件
图 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。

相关文章