Python 语言之JSON对象处理完全指南
什么是JSON对象
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。 在Python中,我们使用json模块来处理JSON数据。
import json # 导入Python内置的json模块
# 案例1:将Python字典转换为JSON字符串
person = {
"name": "张三",
"age": 25,
"city": "北京",
"hobbies": ["阅读", "游泳", "编程"]
}
json_string = json.dumps(person, ensure_ascii=False, indent=2)
# dumps将字典转为JSON字符串,ensure_ascii=False支持中文,indent=2美化格式
print("JSON字符串:")
print(json_string)
# 输出:
# {
# "name": "张三",
# "age": 25,
# "city": "北京",
# "hobbies": ["阅读", "游泳", "编程"]
# }
# 案例2:将JSON字符串解析为Python对象
json_data = '{"name": "李四", "age": 30, "is_student": false}'
python_obj = json.loads(json_data)
# loads将JSON字符串解析为Python字典
print("\nPython对象:")
print(python_obj) # 输出: {'name': '李四', 'age': 30, 'is_student': False}
print("类型:", type(python_obj)) # 输出: <class 'dict'>
JSON文件读写操作
import json
# 案例1:将数据写入JSON文件
data_to_write = {
"employees": [
{"name": "王五", "department": "技术部", "salary": 8000},
{"name": "赵六", "department": "市场部", "salary": 7500},
{"name": "钱七", "department": "人事部", "salary": 7000}
]
}
with open('employees.json', 'w', encoding='utf-8') as f:
json.dump(data_to_write, f, ensure_ascii=False, indent=4)
# dump将数据写入文件,ensure_ascii=False确保中文正常显示
print("数据已写入employees.json文件")
# 案例2:从JSON文件读取数据
with open('employees.json', 'r', encoding='utf-8') as f:
data_from_file = json.load(f)
# load从文件读取JSON数据并解析为Python对象
print("\n从文件读取的数据:")
print(data_from_file)
# 输出: {'employees': [{'name': '王五', 'department': '技术部', 'salary': 8000}, ...]}
复杂的JSON数据处理
import json
# 案例1:处理嵌套的JSON数据
complex_json = '''
{
"company": "科技有限公司",
"departments": [
{
"name": "研发部",
"employees": [
{"id": 1, "name": "工程师A", "skills": ["Python", "Java", "SQL"]},
{"id": 2, "name": "工程师B", "skills": ["JavaScript", "HTML", "CSS"]}
]
},
{
"name": "销售部",
"employees": [
{"id": 3, "name": "销售A", "region": "华北"},
{"id": 4, "name": "销售B", "region": "华南"}
]
}
]
}
'''
# 解析复杂JSON数据
company_data = json.loads(complex_json)
# 将JSON字符串解析为Python字典
# 提取所有员工姓名
all_employees = []
for dept in company_data['departments']:
for emp in dept['employees']:
all_employees.append(emp['name'])
print("所有员工姓名:", all_employees)
# 输出: ['工程师A', '工程师B', '销售A', '销售B']
# 案例2:修改JSON数据并重新序列化
# 给每个员工添加一个active字段
for dept in company_data['departments']:
for emp in dept['employees']:
emp['active'] = True # 添加新字段
# 将修改后的数据转换回JSON字符串
updated_json = json.dumps(company_data, ensure_ascii=False, indent=2)
print("\n更新后的JSON数据:")
print(updated_json)
JSON数据验证和错误处理
import json
# 案例1:处理无效的JSON数据
invalid_json = '{"name": "测试", "age": 25,}' # 注意末尾多余的逗号
try:
data = json.loads(invalid_json)
# 尝试解析无效的JSON
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}")
# 输出: JSON解析错误: Expecting property name enclosed in double quotes
print(f"错误位置: 第{e.lineno}行, 第{e.colno}列")
# 案例2:处理文件不存在的情况
try:
with open('nonexistent.json', 'r', encoding='utf-8') as f:
data = json.load(f)
except FileNotFoundError:
print("文件不存在,创建默认数据")
default_data = {"message": "这是默认数据"}
with open('nonexistent.json', 'w', encoding='utf-8') as f:
json.dump(default_data, f, ensure_ascii=False, indent=2)
print("已创建默认数据文件")
高级JSON处理技巧
import json
from datetime import datetime
# 案例1:自定义JSON序列化(处理日期等特殊类型)
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat() # 将datetime对象转为ISO格式字符串
return super().default(obj)
# 包含日期对象的数据
event_data = {
"event_name": "产品发布会",
"event_date": datetime(2024, 6, 15, 14, 30),
"participants": 150
}
# 使用自定义编码器序列化
json_with_date = json.dumps(event_data, cls=CustomEncoder, ensure_ascii=False)
print("包含日期的JSON:")
print(json_with_date)
# 输出: {"event_name": "产品发布会", "event_date": "2024-06-15T14:30:00", "participants": 150}
# 案例2:JSON数据的筛选和转换
large_data = {
"users": [
{"id": 1, "name": "用户1", "email": "user1@example.com", "active": True},
{"id": 2, "name": "用户2", "email": "user2@example.com", "active": False},
{"id": 3, "name": "用户3", "email": "user3@example.com", "active": True}
]
}
# 只获取活跃用户的姓名和邮箱
active_users = [
{"name": user["name"], "email": user["email"]}
for user in large_data["users"]
if user["active"]
]
print("\n活跃用户信息:")
print(json.dumps(active_users, ensure_ascii=False, indent=2))
JSON与Python数据类型的对应关系
import json
# 案例1:JSON与Python类型转换演示
json_data = '''
{
"string": "hello",
"number": 42,
"float": 3.14,
"boolean": true,
"null_value": null,
"array": [1, 2, 3],
"object": {"key": "value"}
}
'''
python_data = json.loads(json_data)
print("JSON到Python的类型映射:")
for key, value in python_data.items():
print(f"{key}: {value} (类型: {type(value).__name__})")
# 输出:
# string: hello (类型: str)
# number: 42 (类型: int)
# float: 3.14 (类型: float)
# boolean: True (类型: bool)
# null_value: None (类型: NoneType)
# array: [1, 2, 3] (类型: list)
# object: {'key': 'value'} (类型: dict)
# 案例2:处理特殊数值
special_values = {
"infinity": float('inf'), # 无穷大
"negative_infinity": float('-inf'), # 负无穷大
"nan": float('nan') # 非数字
}
# 注意:JSON标准不支持Infinity和NaN,需要特殊处理
try:
json.dumps(special_values)
except ValueError as e:
print(f"\n错误信息: {e}")
# 可以使用默认参数处理这些特殊值
special_json = json.dumps(special_values, default=str)
print("处理后的JSON:", special_json)
总结
JSON在Python中的处理非常灵活强大,主要要点包括:
· 使用json.dumps()和json.loads()进行字符串与对象的转换
· 使用json.dump()和json.load()进行文件读写操作
· 注意中文编码问题(ensure_ascii=False)
· 处理特殊数据类型时需要自定义编码器
· 始终使用try-except处理可能的解析错误
掌握JSON处理对于Web开发、API交互和配置文件处理都非常重要。

3111

被折叠的 条评论
为什么被折叠?



