|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zltzlt 于 2020-1-18 14:16 编辑
使用 Python 处理 JSON 数据格式
JSON 是 JavaScript Object Notation(JavaScript 对象表示法)的缩写。这是一种小型的数据格式。
今天我们将要学习如何用 Python 解析 JSON 数据。
JSON 数据的格式
假设我们有这样一串 JSON 数据:
- {
- "名称" : "鱼 C 论坛",
- "创建时间" : 2010,
- "注册会员数是否破 65W" : true,
- "版块数是否达 30" : false,
- "不遵守规矩的鱼油" : null,
- "管理员" : ["小甲鱼", "不二如是"],
- "其他信息" : {
- "帖子数量" : 112050,
- "回复数量" : 3259023,
- "管理成员数量" : 17
- }
- }
复制代码
可以知道,JSON 数据除了一些地方,看起来和字典很像。True 和 False 在 JSON 中是小写的,而 JSON 中的 null 相当于 Python 中的 None。
这个 JSON 对象几乎包含了所有类型:键均是字符串,值可以是字符串、数字、布尔类型、列表、null,甚至是另一个 JSON 对象。
Python 提供了一个名为 json 的模块处理这些 JSON 数据,今天让我们来学习它的用法。
准备工作
首先,我们可以将上文中的 JSON 数据存储到一个名为 fishc.txt 的文件中:
其次,导入 json 模块,然后用 dir() 查看 json 模块包含的方法:
- >>> import json
- >>> dir(json)
- ['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'codecs', 'decoder', 'detect_encoding', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
复制代码
json 模块的方法挺多的,而我们主要用 load() 或 loads() 解析 JSON 数据,用 dump() 或 dump() 将 Python 的字典转为 JSON 格式的字符串。
json.load() 函数
json.load() 函数可以从文件中读取并解析 JSON 数据,它的第一个参数指定的是文件对象。例如:
我们先从之前创建的文件中加载 JSON 数据:
- file = open("fishc.txt", encoding="utf-8") # 使用 utf-8 编码读取文件
复制代码
然后我们使用 json.load() 函数解析文件中的 JSON 数据并关闭文件:
- fishc = json.load(file)
- file.close()
复制代码
接着我们打印一下 fishc:
结果:
- {'名称': '鱼 C 论坛', '创建时间': 2010, '注册会员数是否破 65W': True, '版块数是否达 30': False, '不遵守规矩的鱼油': None, '管理员': ['小甲鱼', '不二如是'], '其他信息': {'帖子数量': 112050, '回复数量': 3259023, '管理成员数量': 17}}
复制代码
一切正常,解析成功啦 我们也可以查看 fishc 的类型:
- print(type(fishc)) # <class 'dict'>
复制代码
我们看到解析后的数据是字典。
因为这是字典,我们可以通过键访问其数据:
- print(fishc['名称']) # 鱼 C 论坛
- print(fishc['创建时间']) # 2010
- print(fishc['管理员']) # ['小甲鱼', '不二如是']
复制代码
json.loads() 函数
json.loads() 函数用于从字符串中加载并解析 JSON 对象(这就是它为什么叫 loads(),s 代表字符串 string),和 json.load() 大同小异。例如;
- import json
- json_data = '''{
- "名称" : "鱼 C 论坛",
- "创建时间" : 2010,
- "注册会员数是否破 65W" : true,
- "版块数是否达 30" : false,
- "不遵守规矩的鱼油" : null,
- "管理员" : ["小甲鱼", "不二如是"],
- "其他信息" : {
- "帖子数量" : 112050,
- "回复数量" : 3259023,
- "管理成员数量" : 17
- }
- }'''
- fishc = json.loads(json_data)
- print(fishc)
- print(fishc['名称'], fishc['创建时间'], fishc['管理员'])
- print(fishc['其他信息'])
复制代码
执行结果:
- {'名称': '鱼 C 论坛', '创建时间': 2010, '注册会员数是否破 65W': True, '版块数是否达 30': False, '不遵守规矩的鱼油': None, '管理员': ['小甲鱼', '不二如是'], '其他信息': {'帖子数量': 112050, '回复数量': 3259023, '管理成员数量': 17}}
- 鱼 C 论坛 2010 ['小甲鱼', '不二如是']
- {'帖子数量': 112050, '回复数量': 3259023, '管理成员数量': 17}
复制代码
json.dump() 函数
json.dump() 函数用于将 Python 中的字典转化成 JSON 格式的字符串并写入文件。例如:
- import json
- fishc = {'名称': '鱼 C 论坛',
- '创建时间': 2010,
- '注册会员数是否破 65W': True,
- '版块数是否达 30': False,
- '不遵守规矩的鱼油': None,
- '管理员': ['小甲鱼', '不二如是'],
- '其他信息':
- {'帖子数量': 112050,
- '回复数量': 3259023,
- '管理成员数量': 17}}
- with open("fishc_2.txt", "w") as file:
- json.dump(fishc, file)
复制代码
运行这段代码不会报错。但是,如果我们去看看文件中的内容则会大跌眼镜:
- {"\u540d\u79f0": "\u9c7c C \u8bba\u575b", "\u521b\u5efa\u65f6\u95f4": 2010, "\u6ce8\u518c\u4f1a\u5458\u6570\u662f\u5426\u7834 65W": true, "\u7248\u5757\u6570\u662f\u5426\u8fbe 30": false, "\u4e0d\u9075\u5b88\u89c4\u77e9\u7684\u9c7c\u6cb9": null, "\u7ba1\u7406\u5458": ["\u5c0f\u7532\u9c7c", "\u4e0d\u4e8c\u5982\u662f"], "\u5176\u4ed6\u4fe1\u606f": {"\u5e16\u5b50\u6570\u91cf": 112050, "\u56de\u590d\u6570\u91cf": 3259023, "\u7ba1\u7406\u6210\u5458\u6570\u91cf": 17}}
复制代码
这一串数字和 \u 是什么鬼?!
原来是这样,因为字典中包含了非 ASCII 字符(汉字),json 会自动将非 ASCII 字符转化为 Unicode,即以 \u 开头的字符。
为了解决这个问题,我们需要将 ensure_ascii 参数设置为 False:
- json.dump(fishc, file, ensure_ascii=False)
复制代码
再试试就正常了:
- {"名称": "鱼 C 论坛", "创建时间": 2010, "注册会员数是否破 65W": true, "版块数是否达 30": false, "不遵守规矩的鱼油": null, "管理员": ["小甲鱼", "不二如是"], "其他信息": {"帖子数量": 112050, "回复数量": 3259023, "管理成员数量": 17}}
复制代码
json.dumps() 函数
json.dumps() 函数用于将 Python 字典转化为 JSON 格式的字符串,和 json.dumps() 大同小异。例如:
- import json
- fishc = {'名称': '鱼 C 论坛',
- '创建时间': 2010,
- '注册会员数是否破 65W': True,
- '版块数是否达 30': False,
- '不遵守规矩的鱼油': None,
- '管理员': ['小甲鱼', '不二如是'],
- '其他信息':
- {'帖子数量': 112050,
- '回复数量': 3259023,
- '管理成员数量': 17}}
- with open("fishc_2.txt", "w", encoding="utf-8") as file:
- print(json.dumps(fishc, ensure_ascii=False)) # 记得将 ensure_ascii 参数设置为 False
复制代码
运行结果:
- {"名称": "鱼 C 论坛", "创建时间": 2010, "注册会员数是否破 65W": true, "版块数是否达 30": false, "不遵守规矩的鱼油": null, "管理员": ["小甲鱼", "不二如是"], "其他信息": {"帖子数量": 112050, "回复数量": 3259023, "管理成员数量": 17}}
复制代码 |
评分
-
查看全部评分
|