当前位置:首页>python>Python中JSON数据的读取与处理实践

Python中JSON数据的读取与处理实践

  • 2026-09-16 17:27:45
Python中JSON数据的读取与处理实践

关注▲教AI的郑老师▲,和我一起成长。

一、JSON简介

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,易于人阅读和编写,同时也易于机器解析和生成。


1. 基本结构

JSON 由两种结构组成:

  • • 键值对集合(对象,Object)
  • • 有序值列表(数组,Array)

2. 数据类型

JSON 支持以下数据类型:

类型
示例
说明
字符串
"name": "张三"
必须使用双引号
数字
"age": 25
整数或浮点数
布尔值
"isStudent": truetrue
 或 false
数组
"hobbies": ["读书", "游泳"]
有序值列表
对象
"address": {"city": "北京"}
键值对集合
空值
"data": null
表示空值

3. 语法规则

  • • 数据以 键值对 形式存在,键名必须用双引号包裹。
  • • 数据之间用 逗号 分隔。
  • • 对象用 花括号{} 包裹。
  • • 数组用 方括号[] 包裹。

4. 示例

{  "name": "李四",  "age": 30,  "isStudent":false,  "hobbies": ["旅游", "摄影"],  "address": {    "city": "上海",    "postcode": "200000"  },  "scores": [95, 87, 92]}

5. 使用场景

  • • API 数据交换(如 RESTful API 请求/响应)
  • • 配置文件(如 package.json、tsconfig.json)
  • • 数据存储(如 NoSQL 数据库中的文档)
  • • 前后端数据传输

6. 注意事项

  • • JSON 文件通常以 .json 为扩展名。
  • • JSON 中不允许注释(早期设计如此,但某些解析器支持)。
  • • 字符串中的特殊字符需要转义(如 \"、\\、\n)。

7. 编程语言支持

几乎所有现代编程语言都提供 JSON 解析和生成库:

  • • JavaScript: JSON.parse() / JSON.stringify()
  • • Python: json.loads() / json.dumps()
  • • Java: Jackson、Gson 库
  • • PHP: json_decode() / json_encode()

8. 与 XML 对比

特性
JSON
XML
可读性
高
中
数据量
较小
较大
解析速度
快
慢
结构
键值对、数组
树形节点

JSON 因其简洁性和高效性,已成为 Web 开发和数据交换的主流格式。

二、JSON 数据来源

1. 从字符串读取 JSON

import json# JSON 字符串json_string = '''{    "name": "张三",    "age": 25,    "is_student": true,    "courses": ["数学", "英语", "编程"],    "address": {        "city": "北京",        "zipcode": "100000"    }}'''# 使用 json.loads() 解析字符串data = json.loads(json_string)print("类型:", type(data))print("姓名:", data["name"])print("年龄:", data["age"])print("课程:", data["courses"])print("城市:", data["address"]["city"])

运行结果:

类型: <class 'dict'>姓名: 张三年龄: 25课程: ['数学', '英语', '编程']城市: 北京

2. 从文件读取 JSON

创建一个文件 student.json:

{    "student_id": "2023001",    "name": "李四",    "scores": {        "math": 90,        "english": 85,        "programming": 95    },    "graduated":false}

读取文件的 Python 代码:

import json# 方法1:使用 with 语句(推荐)with open('student.json', 'r', encoding='utf-8') as f:    student_data = json.load(f)print("学生ID:", student_data["student_id"])print("数学成绩:", student_data["scores"]["math"])print("是否毕业:", student_data["graduated"])# 方法2:使用 json.load() 直接读取try:    with open('student.json', 'r', encoding='utf-8') as file:        data = json.load(file)    print("\n直接读取结果:")    print("学生姓名:", data["name"])except FileNotFoundError:    print("文件不存在")except json.JSONDecodeError:    print("JSON格式错误")

运行结果:

学生ID: 2023001数学成绩: 90是否毕业: False直接读取结果:学生姓名: 李四

三、不同类型 JSON 数据的读取

1. 读取数组格式的 JSON

import json# JSON 数组(多个对象)json_array = '''[    {"id": 1, "product": "苹果", "price": 5.5},    {"id": 2, "product": "香蕉", "price": 3.2},    {"id": 3, "product": "橙子", "price": 4.8}]'''products = json.loads(json_array)print("商品总数:", len(products))print("\n商品列表:")for product in products:    print(f"  {product['product']}: ¥{product['price']}")# 计算总价total_price = sum(product['price'] for product in products)print(f"\n总价格: ¥{total_price}")

运行结果:

商品总数: 3商品列表:  苹果: ¥5.5  香蕉: ¥3.2  橙子: ¥4.8总价格: ¥13.5

2. 读取嵌套结构的 JSON

import json# 嵌套结构的 JSONcompany_json = '''{    "company_name": "科技公司",    "departments": [        {            "name": "研发部",            "employees": [                {"name": "王工", "position": "工程师", "salary": 15000},                {"name": "赵工", "position": "高级工程师", "salary": 20000}            ]        },        {            "name": "市场部",            "employees": [                {"name": "钱经理", "position": "经理", "salary": 18000}            ]        }    ]}'''company = json.loads(company_json)print(f"公司: {company['company_name']}")print("\n各部门信息:")total_employees = 0for dept in company['departments']:    print(f"  {dept['name']}: {len(dept['employees'])}人")    total_employees += len(dept['employees'])    for emp in dept['employees']:        print(f"    - {emp['name']} ({emp['position']})")print(f"\n员工总数: {total_employees}")

运行结果:

公司: 科技公司各部门信息:  研发部: 2人    - 王工 (工程师)    - 赵工 (高级工程师)  市场部: 1人    - 钱经理 (经理)员工总数: 3

四、读取 JSON 的实用技巧

1. 安全读取 - 处理可能缺失的键

import json# 不完整的 JSON 数据incomplete_json = '''{    "name": "孙七",    "age": 30}'''person = json.loads(incomplete_json)# 安全访问方法print("姓名:", person.get("name", "未知"))print("年龄:", person.get("age", "未知"))print("邮箱:", person.get("email", "未提供"))  # 不存在的键print("职业:", person.get("job", "未指定"))# 检查键是否存在if "email" in person:    print("有邮箱信息")else:    print("无邮箱信息")

运行结果:

姓名: 孙七年龄: 30邮箱: 未提供职业: 未指定无邮箱信息

2. 读取并修改 JSON 数据

import json# 原始 JSONconfig_json = '''{    "app_name": "我的应用",    "version": "1.0.0",    "settings": {        "theme": "light",        "language": "zh-CN",        "notifications": true    }}'''# 读取并修改config = json.loads(config_json)# 修改数据config["version"] = "1.1.0"config["settings"]["theme"] = "dark"config["settings"]["font_size"] = 14  # 添加新设置print("更新后的配置:")print(f"应用名称: {config['app_name']}")print(f"版本: {config['version']}")print(f"主题: {config['settings']['theme']}")print(f"字体大小: {config['settings'].get('font_size', '默认')}")

运行结果:

更新后的配置:应用名称: 我的应用版本: 1.1.0主题: dark字体大小: 14

五、完整示例:读取学生信息文件

创建文件 students.json:

[    {        "id": 101,        "name": "小明",        "grade": "三年级",        "scores": [85, 92, 78, 90],        "active":true    },    {        "id": 102,        "name": "小红",        "grade": "四年级",        "scores": [95, 88, 92, 87],        "active":true    },    {        "id": 103,        "name": "小刚",        "grade": "三年级",        "scores": [75, 82, 79, 85],        "active":false    }]

读取和分析数据的代码:

import jsondef analyze_students(file_path):    """读取并分析学生数据"""    with open(file_path, 'r', encoding='utf-8') as f:        students = json.load(f)    print(f"读取了 {len(students)} 名学生信息")    print("=" * 40)    # 统计信息    active_count = 0    total_scores = []    for student in students:        # 显示基本信息        status = "在读" if student["active"] else "已毕业"        avg_score = sum(student["scores"]) / len(student["scores"])        print(f"姓名: {student['name']}")        print(f"  年级: {student['grade']}")        print(f"  状态: {status}")        print(f"  平均分: {avg_score:.1f}")        # 统计        if student["active"]:            active_count += 1        total_scores.extend(student["scores"])    print("=" * 40)    print(f"在读学生: {active_count}人")    print(f"平均分: {sum(total_scores)/len(total_scores):.1f}")    return students# 运行分析if __name__ == "__main__":    students_data = analyze_students("students.json")

运行结果:

读取了 3 名学生信息========================================姓名: 小明  年级: 三年级  状态: 在读  平均分: 86.2姓名: 小红  年级: 四年级  状态: 在读  平均分: 90.5姓名: 小刚  年级: 三年级  状态: 已毕业  平均分: 80.2========================================在读学生: 2人平均分: 85.6

六、最佳实践总结

  1. 1. 使用 with open() 确保文件正确关闭
  2. 2. 指定 encoding='utf-8' 处理中文
  3. 3. 使用 .get() 方法 安全访问可能不存在的键
  4. 4. 添加错误处理 捕获 JSON 解析错误
  5. 5. 验证数据结构 确保读取到正确的数据类型

这些示例展示了 Python 中读取 JSON 数据的基本和常用方法,涵盖了从简单到实际应用的场景。

最新文章

随机文章