找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2070

积分

0

好友

287

主题
发表于 2025-12-30 17:38:54 | 查看: 24| 回复: 0

Python 编程语言标志
图:Python 标志

在当今的软件开发中,JSON(JavaScript Object Notation)已成为事实上的标准数据交换格式。Python 凭借其内置的 json 模块和丰富的第三方库生态,为处理 JSON 数据提供了全面而强大的支持。本文将为你系统梳理 35 个 Python 处理 JSON 的实战方法,涵盖从基础解析到高级应用、从文件操作到性能优化的各种场景,助你提升开发效率。

1. 解析JSON字符串为字典

使用场景:解析从网络接口、消息队列或前端传来的 JSON 字符串。

import json

json_str = '{"name": "张三", "age": 25}'
data_dict = json.loads(json_str)
print(data_dict['name'])  # 输出:张三

2. 字典序列化为JSON字符串

使用场景:构建 API 请求体或封装接口响应。

data_dict = {"username": "testuser", "password": "123456"}
json_str = json.dumps(data_dict, ensure_ascii=False)  # ensure_ascii=False确保中文正常显示
print(json_str)  # 输出:{"username": "testuser", "password": "123456"}

3. 格式化输出:生成美观的JSON字符串

使用场景:生成易于阅读的日志或配置文件。

data = {"b": 2, "a": 1, "c": 3}
pretty_json = json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False)
print(pretty_json)

4. 处理日期时间等非标准对象

使用场景:序列化包含 datetime 对象等 Python 特有类型的字典。

from datetime import datetime

def custom_serializer(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError(f"Type {type(obj)} not serializable")

data = {"event": "meeting", "time": datetime.now()}
json_str = json.dumps(data, default=custom_serializer, ensure_ascii=False)
print(json_str)

5. 读取JSON文件

使用场景:加载配置文件、测试数据。

with open('config.json', 'r', encoding='utf-8') as f:
    config = json.load(f)
    print(config)

6. 写入JSON文件

使用场景:保存程序运行结果、用户数据。

result = {"status": "success", "data": [1, 2, 3]}
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(result, f, indent=2, ensure_ascii=False)

7. 增量写入大型JSON文件

使用场景:处理海量数据,无法一次性加载到内存。

# 假设有一个巨大的数据列表,逐条写入
big_data = [{"id": i, "value": f"item_{i}"} for i in range(1000000)]
with open('large_data.jsonl', 'w', encoding='utf-8') as f:  # 使用JSON Lines格式
    for item in big_data:
        f.write(json.dumps(item, ensure_ascii=False) + '\n')

8. 提取嵌套字段

使用场景:从 API 返回的深层结构中提取如 token、用户 ID 等关键信息。

data = {"code": 200, "data": {"user": {"id": 1, "name": "李四"}}}
user_name = data["data"]["user"]["name"]
print(user_name)  # 输出:李四

9. 安全访问与默认值

使用场景:访问可能不存在的字段,避免 KeyError

data = {"user": {"name": "王五"}}
email = data.get("user", {}).get("email", "未填写")
print(email)  # 输出:未填写

10. 使用jsonpath-ng进行高级查询

使用场景:适用于对多层嵌套、结构复杂的 JSON 进行类似 XPath 的路径查询。

from jsonpath_ng import parse

data = {
    "store": {
        "book": [
            {"title": "Book A", "price": 20},
            {"title": "Book B", "price": 30}
        ]
    }
}
jsonpath_expr = parse("$.store.book[?(@.price > 25)].title")
matches = [match.value for match in jsonpath_expr.find(data)]
print(matches)  # 输出:['Book B']

提示:需先安装库 pip install jsonpath-ng.

11. 遍历所有键值对

使用场景:调试或记录整个数据结构。

data = {"status": "ok", "count": 5}
for key, value in data.items():
    print(f"{key}: {value}")

12. 判断键是否存在

使用场景:断言接口响应是否包含预期字段。

if "status" in data:
    print("包含状态字段")

13. 添加新字段

使用场景:动态构造请求参数,如添加时间戳、会话 ID。

data = {"user": "admin"}
data["timestamp"] = "2025-12-25T10:30:00"

14. 删除字段

使用场景:清理敏感信息(如密码)或不需要的数据。

data = {"username": "test", "password": "secret", "age": 20}
data.pop("password", None)  # 使用pop更安全

15. 修改字段值

使用场景:更新配置或数据状态。

data["user"]["name"] = "新的名字"

16. 合并两个JSON对象

使用场景:合并多个来源的配置或数据。

dict1 = {"a": 1}
dict2 = {"b": 2}
merged = {**dict1, **dict2}  # Python 3.5+
# 或使用 dict1.update(dict2)

17. 深度合并(递归合并)

使用场景:合并嵌套的配置字典。

def deep_merge(a, b):
    for key in b:
        if key in a and isinstance(a[key], dict) and isinstance(b[key], dict):
            deep_merge(a[key], b[key])
        else:
            a[key] = b[key]
    return a

base_config = {"db": {"host": "localhost"}}
override = {"db": {"port": 5432}}
final_config = deep_merge(base_config, override)

18. 键名风格转换

使用场景:对接不同语言的后端(如 Java 的 camelCase 转 Python 的 snake_case)。

import re

def camel_to_snake(name):
    name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()

data = {"userName": "Tom", "orderId": 100}
snake_data = {camel_to_snake(k): v for k, v in data.items()}
print(snake_data)  # 输出:{'user_name': 'Tom', 'order_id': 100}

19. 过滤JSON列表

使用场景:从用户列表中筛选出成年人。

users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 17}]
adults = [u for u in users if u['age'] >= 18]

20. 列表排序

使用场景:按某个字段对结果进行排序。

sorted_users = sorted(users, key=lambda x: x['age'], reverse=True)

21. 数据映射转换

使用场景:提取对象列表中的特定字段,或进行格式转换。

names = list(map(lambda x: x['name'], users))
# 或使用列表推导式: names = [u['name'] for u in users]

22. 使用Pandas进行复杂处理

使用场景:对 JSON 数据进行类似 SQL 的查询、分组、聚合。

import pandas as pd

df = pd.DataFrame(users)
# 筛选并计算平均年龄
avg_age = df[df['age'] >= 18]['age'].mean()
print(f"成年人平均年龄: {avg_age}")

提示:需先安装库 pip install pandas

23. 校验JSON格式

使用场景:验证字符串是否为有效的 JSON。

def is_valid_json(json_str):
    try:
        json.loads(json_str)
        return True
    except json.JSONDecodeError:
        return False

24. 比较两个JSON是否相等

使用场景:断言接口响应与预期结果一致。

def json_equal(a, b):
    return json.dumps(a, sort_keys=True) == json.dumps(b, sort_keys=True)

25. 查找差异(使用deepdiff)

使用场景:精确找出两个复杂 JSON 结构之间的不同之处。

from deepdiff import DeepDiff

expected = {"a": 1, "b": {"c": 2}}
actual = {"a": 1, "b": {"c": 3}}
diff = DeepDiff(expected, actual)
print(diff)  # 输出:{'values_changed': {"root['b']['c']": {'new_value': 3, 'old_value': 2}}}

提示:需先安装库 pip install deepdiff

26. 使用tabulate美化打印

使用场景:在控制台以表格形式清晰展示 JSON 列表数据。

from tabulate import tabulate

data = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 17}]
print(tabulate(data, headers="keys", tablefmt="grid"))

提示:需先安装库 pip install tabulate

27. 使用pprint格式化打印

使用场景:调试时更美观地打印任何 Python 数据结构(包括字典/列表)。

from pprint import pprint

complex_data = {"a": [1,2,3], "b": {"c": {"d": "deep"}}}
pprint(complex_data, indent=2, width=50)

28. 使用requests库处理API JSON

使用场景:发送 JSON 请求并解析 JSON 响应。

import requests

# 发送JSON请求体
resp = requests.post(' https://api.example.com/login',
                     json={"user": "test", "pwd": "123"})
# 自动将响应内容解析为字典
data = resp.json()
if data.get('code') == 200:
    token = data['data']['token']

29. 模拟API响应(Mock)

使用场景:单元测试或开发前期,模拟后端接口。

from unittest.mock import Mock

def mock_user_api():
    mock_resp = Mock()
    mock_resp.json.return_value = {"id": 1, "name": "Mock User"}
    mock_resp.status_code = 200
    return mock_resp

# 在测试中使用 mock_resp

30. 使用FastAPI提供JSON API

使用场景:快速构建一个返回 JSON 的 Web 服务。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/")
def create_item(item: Item):
    # item 自动被解析为Pydantic模型
    return {"message": f"Item {item.name} created", "price": item.price}

# 运行后,该端点自动接收和返回JSON

提示:需先安装库 pip install fastapi uvicorn

31. 错误处理与异常捕获

使用场景:增强代码健壮性,处理网络超时、数据格式错误等异常。

import json
import requests
from requests.exceptions import Timeout

def safe_json_request(url):
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()  # 检查HTTP错误
        return response.json()
    except Timeout:
        print("请求超时")
        return None
    except json.JSONDecodeError:
        print("响应不是有效的JSON格式")
        return None
    except KeyError as e:
        print(f"缺少必要字段: {e}")
        return None

32. JSON Schema校验

使用场景:在接口测试或数据入库前,对 JSON 结构进行强校验。

from jsonschema import validate, ValidationError

# 定义schema
user_schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer", "minimum": 0}
    },
    "required": ["name", "age"]
}

# 待校验数据
user_data = {"name": "张三", "age": 25}

try:
    validate(instance=user_data, schema=user_schema)
    print("数据校验通过")
except ValidationError as e:
    print(f"数据校验失败: {e.message}")

提示:需先安装库 pip install jsonschema

33. 性能优化:流式处理大型JSON

使用场景:处理超大型 JSON 文件,避免内存溢出。

import ijson

def process_large_json(file_path):
    with open(file_path, 'rb') as f:
        # 流式解析,逐条处理
        for item in ijson.items(f, 'item'):
            # 处理每条数据
            process_item(item)

提示:需先安装库 pip install ijson

34. 与NoSQL数据库交互

使用场景:将 JSON 数据直接存储到 MongoDB 等 NoSQL 数据库。

from pymongo import MongoClient

# 连接MongoDB
client = MongoClient('localhost', 27017)
db = client['mydatabase']
collection = db['users']

# 插入JSON数据
user_data = {"name": "张三", "age": 25, "email": "zhangsan@example.com"}
result = collection.insert_one(user_data)
print(f"插入文档ID: {result.inserted_id}")

# 查询JSON数据
query_result = collection.find_one({"name": "张三"})
print(f"查询结果: {query_result}")

提示:需先安装库 pip install pymongo

35. JSON序列化自定义对象

使用场景:序列化包含自定义类的复杂对象。

import json
from datetime import datetime

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

    def to_dict(self):
        return {
            "name": self.name,
            "join_date": self.join_date.isoformat()
        }

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, User):
            return obj.to_dict()
        elif isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)

# 使用自定义编码器
user = User("张三", datetime.now())
json_str = json.dumps(user, cls=CustomEncoder, ensure_ascii=False)
print(json_str)

总结与场景应用

本文系统介绍了 Python 处理 JSON 的 35 个实用方法,从基础的 json.loads/dumps 到结合 requestspandasjsonpath-ng 等库的高级应用。通过灵活组合这些方法,你将能够高效、优雅地处理各种 JSON 数据处理任务,提升开发效率与代码质量。

掌握这些方法将能轻松应对以下场景:

  • 接口开发与测试:使用 requests 发送/接收 JSON,结合 Mock 进行单元测试。
  • 数据清洗与转换:利用 Pandas 进行复杂处理,使用 jsonpath-ng 进行高级查询。
  • 配置文件管理:安全读写 JSON 配置文件,支持深度合并和键名转换。
  • Web服务开发:使用 FastAPI 快速构建 RESTful API。
  • 大数据处理:通过流式处理和增量写入应对海量数据。
  • 数据校验与调试:使用 JSON Schema 进行结构校验,利用 deepdiff 比较差异。

如果你希望深入系统地学习 Python 的各个方面,包括更多数据处理技巧和 Web 开发框架,可以访问 云栈社区的 Python 技术板块,那里有丰富的教程和开发者讨论。

正所谓“无他,惟手熟尔”!有需要的用起来!

微笑表情包




上一篇:JIT与AOT优化下的Java性能对比分析:现代JVM与框架影响探究
下一篇:Python向量搜索实战:法律文档语义检索性能提升54倍
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 18:36 , Processed in 0.263302 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表