python进阶之JSON数据解析完整示例
作者:G-1科罗纳
引言
在当今数据驱动的世界中,JSON已成为数据交换的事实标准。无论是与 Web API 交互、配置应用程序、存储结构化数据,还是处理来自物联网设备的数据,几乎不可避免地会遇到 JSON 格式。
一、JSON简介
JSON(JavaScript Object Notation)是一种轻量级的、基于文本的数据交换格式。它被设计为易于人阅读和编写,同时也易于机器解析和生成,被广泛应用于各种编程语言和平台之间。
JSON 数据由键值对组成,支持以下几种基本数据类型:
- 对象 (Object): 用花括号
{}包围,包含零个或多个键值对,键是字符串,值可以是任何有效的 JSON 数据类型。 - 数组 (Array): 用方括号
[]包围,包含零个或多个值,值之间用逗号分隔。 - 字符串 (String): 用双引号
""包围的字符序列。 - 数字 (Number): 整数或浮点数。
- 布尔值 (Boolean):
true或false - 空值 (Null):
null
例如:
people.json文件:
[
{
"name": "张三",
"gender": "男",
"age": 25
},
{
"name": "李四",
"gender": "女",
"age": 23
}
]二、python中JSON模块
Python 的 JSON模块是处理 JSON 数据的标准工具。它提供了四个核心函数用于在 JSON 字符串/文件和 Python 对象之间进行转换:
2.1 json.load()
从 JSON文件对象读取并解析为Python 对象。
json.load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 参数:
fp: 一个支持.read()方法的文本文件对象,数据从这个文件对象中读取。cls(可选): 用于自定义 JSON 解码器的类。通常用于处理复杂的对象。object_hook(可选): 一个函数,用于在解码每个 JSON 对象后进行自定义处理。它接收一个字典作为参数,并应返回一个对象(通常是字典或自定义对象)。parse_float(可选): 一个函数,用于将 JSON 中的浮点数字符串转换为 Python 对象。默认是float。parse_int(可选): 一个函数,用于将 JSON 中的整数字符串转换为 Python 对象。parse_constant(可选): 一个函数,用于处理 JSON 常量 ('-Infinity','Infinity','NaN')。object_pairs_hook(可选): 一个函数,接收一个由(key, value)对组成的列表,并返回一个对象。object_pairs_hook优先于object_hook。**kw(可选): 其他关键字参数。- 返回值: 一个 Python 对象(通常是
dict或list)。
2.2 json.loads()
从JSON 字符串(str)读取并解析为 Python 对象。
json.loads(s, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)参数同
json.dump。
2.3 json.load()
将 Python 对象 编码为 JSON格式写入文件。
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True,
check_circular=True, allow_nan=True, cls=None, indent=None,
separators=None, default=None, sort_keys=False, **kw)
- 参数:
obj: 一个必需的参数。要序列化的 Python 对象。它必须是dict,list,tuple,str,int,float,bool,None,或者是一个实现了__json__()方法的对象。fp: 一个必需的参数。一个支持.write()方法的文本文件对象(通常由open()函数返回,模式为'w'或'a')。JSON 数据将写入这个文件对象。skipkeys(可选): 如果为True,当字典的键不是基本类型(str,int,float,bool,None)时,会自动跳过该键值对,而不是引发TypeError。ensure_ascii(可选): 如果为True,输出将确保所有非 ASCII 字符都被转义。如果为False,则允许直接输出这些字符(通常用于生成人类可读的文件)。check_circular(可选): 如果为True,会检查容器类型的循环引用(如列表包含自身),如果发现则引发ValueError。如果为False,则不检查,但遇到循环引用时行为未定义。allow_nan(可选): 如果为True,允许float类型的NaN,Infinity,-Infinity。如果为False,则在序列化这些值时会引发ValueError。cls(可选): 用于自定义 JSON 编码器的类。indent(可选): 用于美化输出。如果是一个非负整数或字符串(如'\t'),则 JSON 数组元素和对象成员将被换行并使用该值进行缩进,使其更易读。None(默认)表示单行输出。separators(可选): 一个(item_separator, key_separator)元组。默认是(', ', ': ')。可以设置为(',', ':')以减少输出大小(去除空格)。default(可选): 一个函数,用于处理json模块无法序列化的对象。该函数应返回一个可序列化的对象,或者引发TypeError。sort_keys(可选): 如果为True,则字典的输出将按键的字符串表示进行排序。**kw(可选): 其他关键字参数。- 返回值: 无 (
None)。
2.4 json.dumps()
将 Python 对象 编码为 JSON 字符串(str)。
json.dumps(obj, *, skipkeys=False, ensure_ascii=True,
check_circular=True, allow_nan=True, cls=None, indent=None,
separators=None, default=None, sort_keys=False, **kw)参数同
json.dump。
三、数据格式转换规则
Python 对象与 JSON 值之间的转换规则是数据处理的关键。
JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
注意:
- JSON 的
null对应 Python 的None。 - JSON 的
true/false对应 Python 的True/False。
四、异常处理
JSONDecodeError 是 ValueError 的一个子类,提供了更丰富的错误信息,当解析 JSON 文档时发生错误(即 JSON 格式不正确)时会引发此异常,这对于调试 JSON 格式问题非常有帮助。
(该异常在 Python 3.5 版本中添加)
exception json.JSONDecodeError(msg, doc, pos)
额外的属性:
msg: 未格式化的错误消息(即描述错误原因的文本)。doc: 正在被解析的原始 JSON 文档(字符串)。pos: 在doc字符串中,解析失败开始的索引位置(从 0 开始的字符位置)。lineno: 与pos位置对应的行号(从 1 开始计数)。colno: 与pos位置对应的列号(从 1 开始计数)。
示例:
新建一个bad.json文件:
{
"name": "Alice",
"age": 30, // 这里多了一个逗号
}尝试解析它:
import json
try:
with open('bad.json', 'r') as file:
data = json.load(file)
except json.JSONDecodeError as e:
print(f"错误消息: {e.msg}")
print(f"错误位置: 第 {e.lineno} 行, 第 {e.colno} 列")
print(f"错误索引: {e.pos}")
# 如果需要,可以打印整个文档或相关部分
# print(f"文档: {e.doc}")可能的输出:
错误消息: Expecting property name enclosed in double quotes 错误位置: 第 3 行, 第 2 列 错误索引: 35
五、完整示例
解析第一章节中的people.json文件:
import json
# 1. 定义文件名
filename = 'people.json'
try:
# 2. 打开文件并读取
with open(filename, 'r', encoding='utf-8') as file:
# 3. 使用 json.load() 解析文件内容
data = json.load(file)
# 4. 打印解析结果,验证数据类型和内容
print("=== 解析结果 ===")
print("原始数据类型:", type(data)) # <class 'list'>
print("解析后的数据 (Python 列表):")
print(data)
print("\n")
# 5. 访问和使用数据
print("=== 信息 ===")
for person in data:
print(f"{person['name']} - {person['gender']}, {person['age']}岁")
except FileNotFoundError:
print(f"错误:找不到文件 '{filename}'。")
print("请确保 'people.json' 文件存在于当前目录,或者检查文件名是否正确。")
except Exception as e:
print(f"发生未知错误: {e}")结果:
=== 解析结果 ===
原始数据类型: <class 'list'>
解析后的数据 (Python 列表):
[{'name': '张三', 'gender': '男', 'age': 25}, {'name': '李四', 'gender': '女', 'age': 23}]
=== 信息 ===
张三 - 男, 25岁
李四 - 女, 23岁参考
到此这篇关于python进阶之JSON数据解析的文章就介绍到这了,更多相关python JSON数据解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
