Python 语言之JSON对象处理完全指南

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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交互和配置文件处理都非常重要。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一剑的CS_DN博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值