百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Python教程(二十九):JSON数据处理

liuian 2025-07-27 22:01 49 浏览

今日目标

o 理解JSON格式的特点和用途

o 掌握Python中JSON的序列化和反序列化

o 学会处理复杂的JSON数据结构

o 了解JSON在Web API中的应用

JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下特点:

o 人类可读:格式简洁,易于理解

o 语言无关:几乎所有编程语言都支持

o 结构化:支持嵌套的数据结构

o 标准化:被广泛用于Web API和数据交换

JSON数据类型

# JSON支持的数据类型
{
    "string": "Hello World",
    "number": 42,
    "float": 3.14,
    "boolean": true,
    "null": null,
    "array": [1, 2, 3, "four"],
    "object": {
        "name": "Python",
        "version": 3.9
    }
}

Python中的JSON操作

1. 导入JSON模块

import json

2. JSON序列化(Python对象 → JSON字符串)

# 基本数据类型
data = {
    "name": "张三",
    "age": 25,
    "is_student": True,
    "hobbies": ["编程", "读书", "运动"],
    "address": {
        "city": "北京",
        "district": "朝阳区"
    }
}

# 转换为JSON字符串
json_string = json.dumps(data, ensure_ascii=False, indent=2)
print(json_string)

输出:

{
  "name": "张三",
  "age": 25,
  "is_student": true,
  "hobbies": ["编程", "读书", "运动"],
  "address": {
    "city": "北京",
    "district": "朝阳区"
  }
}

3. JSON反序列化(JSON字符串 → Python对象)

# 从JSON字符串解析数据
json_data = '''
{
    "name": "李四",
    "age": 30,
    "skills": ["Python", "JavaScript", "SQL"],
    "projects": [
        {"name": "电商网站", "duration": "3个月"},
        {"name": "数据分析工具", "duration": "2个月"}
    ]
}
'''

# 解析JSON
parsed_data = json.loads(json_data)
print(f"姓名: {parsed_data['name']}")
print(f"技能: {', '.join(parsed_data['skills'])}")
print(f"项目数量: {len(parsed_data['projects'])}")

高级JSON操作

1. 自定义序列化

import json
from datetime import datetime

class User:
    def __init__(self, name, age, created_at):
        self.name = name
        self.age = age
        self.created_at = created_at

# 自定义JSON编码器
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        elif isinstance(obj, User):
            return {
                "name": obj.name,
                "age": obj.age,
                "created_at": obj.created_at.isoformat()
            }
        return super().default(obj)

# 使用自定义编码器
user = User("王五", 28, datetime.now())
json_data = json.dumps(user, cls=CustomEncoder, ensure_ascii=False)
print(json_data)

2. 处理复杂数据结构

# 处理包含特殊字符的数据
complex_data = {
    "message": "Hello\nWorld\tTab",
    "special_chars": "引号\"和反斜杠\\",
    "unicode": "中文和emoji "
}

# 序列化时处理特殊字符
json_string = json.dumps(complex_data, ensure_ascii=False, indent=2)
print(json_string)

# 从文件读取JSON
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(complex_data, f, ensure_ascii=False, indent=2)

# 从文件读取JSON
with open('data.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)
    print(loaded_data)

3. JSON验证和错误处理

def safe_json_parse(json_string):
    """安全地解析JSON字符串"""
    try:
        return json.loads(json_string)
    except json.JSONDecodeError as e:
        print(f"JSON解析错误: {e}")
        return None
    except Exception as e:
        print(f"其他错误: {e}")
        return None

# 测试错误处理
invalid_json = '{"name": "test", "age": 25,}'  # 多余的逗号
result = safe_json_parse(invalid_json)
if result is None:
    print("JSON解析失败")

真实应用示例

1. 配置文件管理

import json
import os

class ConfigManager:
    def __init__(self, config_file="config.json"):
        self.config_file = config_file
        self.config = self.load_config()
    
    def load_config(self):
        """加载配置文件"""
        if os.path.exists(self.config_file):
            try:
                with open(self.config_file, 'r', encoding='utf-8') as f:
                    return json.load(f)
            except json.JSONDecodeError:
                print("配置文件格式错误,使用默认配置")
                return self.get_default_config()
        else:
            return self.get_default_config()
    
    def save_config(self):
        """保存配置文件"""
        with open(self.config_file, 'w', encoding='utf-8') as f:
            json.dump(self.config, f, ensure_ascii=False, indent=2)
    
    def get_default_config(self):
        """获取默认配置"""
        return {
            "database": {
                "host": "localhost",
                "port": 5432,
                "name": "myapp"
            },
            "api": {
                "base_url": "https://api.example.com",
                "timeout": 30
            },
            "logging": {
                "level": "INFO",
                "file": "app.log"
            }
        }
    
    def get(self, key, default=None):
        """获取配置值"""
        keys = key.split('.')
        value = self.config
        for k in keys:
            if isinstance(value, dict) and k in value:
                value = value[k]
            else:
                return default
        return value
    
    def set(self, key, value):
        """设置配置值"""
        keys = key.split('.')
        config = self.config
        for k in keys[:-1]:
            if k not in config:
                config[k] = {}
            config = config[k]
        config[keys[-1]] = value

# 使用示例
config = ConfigManager()
print(f"数据库主机: {config.get('database.host')}")
print(f"API超时: {config.get('api.timeout')}")

# 修改配置
config.set('database.port', 5433)
config.save_config()

2. API数据处理

import json
import requests

class APIClient:
    def __init__(self, base_url):
        self.base_url = base_url
        self.session = requests.Session()
    
    def get_users(self):
        """获取用户列表"""
        try:
            response = self.session.get(f"{self.base_url}/users")
            response.raise_for_status()
            return response.json()
        except requests.RequestException as e:
            print(f"API请求错误: {e}")
            return None
    
    def create_user(self, user_data):
        """创建新用户"""
        try:
            headers = {'Content-Type': 'application/json'}
            response = self.session.post(
                f"{self.base_url}/users",
                data=json.dumps(user_data, ensure_ascii=False),
                headers=headers
            )
            response.raise_for_status()
            return response.json()
        except requests.RequestException as e:
            print(f"创建用户失败: {e}")
            return None
    
    def update_user(self, user_id, user_data):
        """更新用户信息"""
        try:
            headers = {'Content-Type': 'application/json'}
            response = self.session.put(
                f"{self.base_url}/users/{user_id}",
                data=json.dumps(user_data, ensure_ascii=False),
                headers=headers
            )
            response.raise_for_status()
            return response.json()
        except requests.RequestException as e:
            print(f"更新用户失败: {e}")
            return None

# 使用示例
api_client = APIClient("https://jsonplaceholder.typicode.com")

# 获取用户列表
users = api_client.get_users()
if users:
    print(f"获取到 {len(users)} 个用户")
    for user in users[:3]:  # 显示前3个用户
        print(f"- {user['name']} ({user['email']})")

# 创建新用户
new_user = {
    "name": "张三",
    "email": "zhangsan@example.com",
    "phone": "13800138000"
}

created_user = api_client.create_user(new_user)
if created_user:
    print(f"用户创建成功,ID: {created_user.get('id')}")

3. 数据分析和处理

import json
import pandas as pd
from collections import Counter

class DataAnalyzer:
    def __init__(self):
        self.data = []
    
    def load_from_json(self, file_path):
        """从JSON文件加载数据"""
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                self.data = json.load(f)
            print(f"成功加载 {len(self.data)} 条数据")
        except Exception as e:
            print(f"加载数据失败: {e}")
    
    def analyze_sales_data(self):
        """分析销售数据"""
        if not self.data:
            print("没有数据可分析")
            return
        
        # 转换为DataFrame
        df = pd.DataFrame(self.data)
        
        # 基本统计
        print("=== 销售数据分析 ===")
        print(f"总销售额: {df['amount'].sum():.2f}")
        print(f"平均订单金额: {df['amount'].mean():.2f}")
        print(f"最大订单金额: {df['amount'].max():.2f}")
        print(f"最小订单金额: {df['amount'].min():.2f}")
        
        # 按产品分类统计
        product_stats = df.groupby('product')['amount'].agg(['sum', 'count', 'mean'])
        print("\n=== 产品统计 ===")
        print(product_stats)
        
        # 按地区统计
        region_stats = df.groupby('region')['amount'].sum().sort_values(ascending=False)
        print("\n=== 地区销售排名 ===")
        print(region_stats)
        
        return {
            'total_sales': df['amount'].sum(),
            'avg_order': df['amount'].mean(),
            'product_stats': product_stats.to_dict(),
            'region_stats': region_stats.to_dict()
        }
    
    def export_analysis(self, analysis_result, output_file):
        """导出分析结果"""
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(analysis_result, f, ensure_ascii=False, indent=2)
        print(f"分析结果已导出到: {output_file}")

# 示例数据
sample_data = [
    {"product": "笔记本电脑", "amount": 5999, "region": "北京", "date": "2024-01-15"},
    {"product": "手机", "amount": 3999, "region": "上海", "date": "2024-01-16"},
    {"product": "平板电脑", "amount": 2999, "region": "广州", "date": "2024-01-17"},
    {"product": "笔记本电脑", "amount": 5999, "region": "深圳", "date": "2024-01-18"},
    {"product": "手机", "amount": 3999, "region": "北京", "date": "2024-01-19"}
]

# 保存示例数据
with open('sales_data.json', 'w', encoding='utf-8') as f:
    json.dump(sample_data, f, ensure_ascii=False, indent=2)

# 使用分析器
analyzer = DataAnalyzer()
analyzer.load_from_json('sales_data.json')
analysis_result = analyzer.analyze_sales_data()
analyzer.export_analysis(analysis_result, 'analysis_result.json')

最佳实践

1. 性能优化

# 使用ujson提高性能(需要安装:pip install ujson)
try:
    import ujson as json
    print("使用ujson进行高性能JSON处理")
except ImportError:
    print("使用标准json模块")

# 大文件处理
def process_large_json(file_path):
    """处理大型JSON文件"""
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            try:
                data = json.loads(line.strip())
                yield data
            except json.JSONDecodeError:
                continue

# 使用示例
for item in process_large_json('large_data.json'):
    # 处理每个数据项
    print(f"处理: {item.get('id', 'unknown')}")

2. 数据验证

from typing import Dict, Any, Optional
import json

def validate_json_schema(data: Dict[str, Any], schema: Dict[str, Any]) -> bool:
    """简单的JSON模式验证"""
    try:
        for key, expected_type in schema.items():
            if key not in data:
                print(f"缺少必需字段: {key}")
                return False
            
            if not isinstance(data[key], expected_type):
                print(f"字段 {key} 类型错误,期望 {expected_type},实际 {type(data[key])}")
                return False
        
        return True
    except Exception as e:
        print(f"验证过程出错: {e}")
        return False

# 使用示例
user_schema = {
    "name": str,
    "age": int,
    "email": str,
    "is_active": bool
}

test_user = {
    "name": "张三",
    "age": 25,
    "email": "zhangsan@example.com",
    "is_active": True
}

if validate_json_schema(test_user, user_schema):
    print("用户数据验证通过")
else:
    print("用户数据验证失败")

今日总结

今天我们学习了JSON数据处理的核心知识:

1. JSON格式特点:轻量级、人类可读、语言无关的数据交换格式

2. 序列化和反序列化:使用json.dumps()json.loads()进行数据转换

3. 高级操作:自定义编码器、错误处理、文件操作

4. 真实应用:配置文件管理、API数据处理、数据分析

5. 最佳实践:性能优化、数据验证、大文件处理

JSON是现代软件开发中最重要的数据交换格式之一,掌握JSON处理对于Web开发、API集成、数据存储等场景都至关重要。

相关推荐

驱动网卡(怎么从新驱动网卡)
驱动网卡(怎么从新驱动网卡)

网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...

2026-01-30 00:37 liuian

win10更新助手装系统(微软win10更新助手)

1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...

windows11专业版密钥最新(windows11专业版激活码永久)

 Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...

手机删过的软件恢复(手机删除过的软件怎么恢复)
手机删过的软件恢复(手机删除过的软件怎么恢复)

操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...

2026-01-29 23:55 liuian

一键ghost手动备份系统步骤(一键ghost 备份)

  步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。  步骤...

怎么创建局域网(怎么创建局域网打游戏)

  1、购买路由器一台。进入路由器把dhcp功能打开  2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。  3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...

精灵驱动器官方下载(精灵驱动手机版下载)

是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...

一键还原系统步骤(一键还原系统有哪些)

1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。  2、在弹出的“准备安装”窗口中,可...

电脑加速器哪个好(电脑加速器哪款好)

我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...

任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)

是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...

u盘怎么恢复文件(u盘文件恢复的方法)

开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...

系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)

1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...

剪贴板权限设置方法(剪贴板访问权限)
剪贴板权限设置方法(剪贴板访问权限)

1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...

2026-01-29 21:37 liuian

平板系统重装大师(平板重装win系统)

如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...

联想官网售后服务网点(联想官网售后服务热线)

联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...