一、JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,易于人阅读和编写,同时也易于机器解析和生成。
1. 基本结构
JSON 由两种结构组成:
2. 数据类型
JSON 支持以下数据类型:
| | |
|---|
| "name": "张三" | |
| "age": 25 | |
| "isStudent": true | true |
| "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)
6. 注意事项
- • JSON 中不允许注释(早期设计如此,但某些解析器支持)。
- • 字符串中的特殊字符需要转义(如
\"、\\、\n)。
7. 编程语言支持
几乎所有现代编程语言都提供 JSON 解析和生成库:
- • JavaScript:
JSON.parse() / JSON.stringify() - • Python:
json.loads() / json.dumps() - • PHP:
json_decode() / json_encode()
8. 与 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. 使用
with open() 确保文件正确关闭 - 2. 指定
encoding='utf-8' 处理中文 - 3. 使用
.get() 方法 安全访问可能不存在的键
这些示例展示了 Python 中读取 JSON 数据的基本和常用方法,涵盖了从简单到实际应用的场景。