Python JSON数据处理全指南:从基础到高阶实践

一、JSON基础操作

1.1 核心方法对比

graph TD
    A[JSON] -->|序列化| B[str]
    A -->|反序列化| C[dict/list]
    B --> D[json.dumps()]
    C --> E[json.loads()]
方法输入类型输出类型常用参数
json.dumps()Python对象JSON字符串indent, sort_keys, default
json.loads()JSON字符串Python对象object_hook, parse_float
json.dump()Python对象文件对象同dumps()
json.load()文件对象Python对象同loads()
图片[1]_Python JSON数据处理全指南:从基础到高阶实践_知途无界

1.2 基础转换示例

import json

data = {
    "name": "Alice",
    "age": 30,
    "skills": ["Python", "SQL"],
    "contact": {"email": "alice@example.com"}
}

# 序列化
json_str = json.dumps(data, indent=2)
print(json_str)

# 反序列化
restored_data = json.loads(json_str)
assert data == restored_data

二、高级序列化控制

2.1 自定义编码器

from datetime import datetime
from json import JSONEncoder

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

data = {"event": "meeting", "time": datetime.now()}
print(json.dumps(data, cls=CustomEncoder))

2.2 处理特殊类型

类型处理方案示例
datetime转换为ISO格式字符串obj.isoformat()
Decimal转为字符串或floatstr(obj)
自定义类实现__json__方法return obj.__json__()
二进制数据Base64编码base64.b64encode(obj).decode()

三、性能优化技巧

3.1 大数据处理方案

# 流式处理大JSON文件
def process_large_file(path):
    with open(path, 'r') as f:
        for line in f:
            yield json.loads(line)

# 使用ijson库增量解析
import ijson
for item in ijson.items(open('big.json'), 'item'):
    process(item)

3.2 性能对比测试

import timeit

setup = '''
import json
data = [{"id": i, "value": "test"*10} for i in range(10000)]
'''

tests = {
    'dumps': 'json.dumps(data)',
    'dump': 'with open("temp.json","w") as f: json.dump(data,f)',
    'ujson': 'import ujson; ujson.dumps(data)'
}

for name, code in tests.items():
    t = timeit.timeit(code, setup=setup, number=100)
    print(f"{name}: {t:.3f}秒")

典型结果​:

  • json模块:2.3秒
  • ujson模块:0.8秒
  • orjson模块:0.5秒

四、JSON Schema验证

4.1 模式定义示例

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 3},
        "age": {"type": "number", "minimum": 18},
        "skills": {
            "type": "array",
            "items": {"type": "string"},
            "minItems": 1
        }
    },
    "required": ["name"]
}

4.2 验证实现

from jsonschema import validate

valid_data = {"name": "Alice", "age": 25}
invalid_data = {"age": 15}

try:
    validate(valid_data, schema)  # 通过
    validate(invalid_data, schema)  # 抛出异常
except Exception as e:
    print(f"验证失败: {e}")

五、特殊场景处理

5.1 循环引用解决

def safe_serialize(obj):
    def _default(o):
        if hasattr(o, '__dict__'):
            return o.__dict__
        raise TypeError(f"无法序列化 {type(o)}")
    return json.dumps(obj, default=_default)

class Node:
    def __init__(self, value):
        self.value = value
        self.children = []

root = Node(1)
root.children.append(Node(2))
root.children[0].parent = root  # 循环引用

print(safe_serialize(root))

5.2 非ASCII字符处理

data = {"city": "北京", "population": 2171}
# 确保ensure_ascii=False
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)  # 正确显示中文

六、安全防护措施

6.1 JSON注入防护

import ast

def safe_loads(json_str):
    try:
        return json.loads(json_str)
    except json.JSONDecodeError:
        # 二次验证防止恶意代码
        return ast.literal_eval(json_str)

6.2 敏感信息过滤

def sanitize(data):
    if isinstance(data, dict):
        return {k: '[REDACTED]' if 'password' in k else sanitize(v) 
                for k, v in data.items()}
    return data

user_data = {"username": "admin", "password": "123456"}
print(json.dumps(sanitize(user_data)))

七、与其他格式互转

7.1 XML ↔ JSON

from xml.etree import ElementTree
from xmltodict import parse

xml_data = '''
<user>
    <name>Alice</name>
    <age>30</age>
</user>
'''

# XML转JSON
dict_data = parse(xml_data)
json_data = json.dumps(dict_data)

# JSON转XML
data = json.loads(json_data)
root = ElementTree.Element("user")
ElementTree.SubElement(root, "name").text = data["user"]["name"]

7.2 CSV ↔ JSON

import csv

# CSV转JSON
with open('data.csv') as f:
    reader = csv.DictReader(f)
    json_data = json.dumps([row for row in reader])

# JSON转CSV
data = json.loads(json_data)
with open('output.csv', 'w') as f:
    writer = csv.DictWriter(f, fieldnames=data[0].keys())
    writer.writeheader()
    writer.writerows(data)

八、企业级实践方案

8.1 API响应处理

from flask import jsonify

@app.route('/api/user')
def get_user():
    user = db.get_user()
    return jsonify({
        "data": user.to_dict(),
        "meta": {
            "version": "1.0",
            "timestamp": datetime.now().isoformat()
        }
    })

8.2 配置管理系统

class Config:
    def __init__(self, path):
        with open(path) as f:
            self._data = json.load(f)
    
    def get(self, key, default=None):
        return self._data.get(key, default)

# 使用示例
config = Config('settings.json')
db_url = config.get('database.url')

九、调试与问题排查

9.1 格式化输出技巧

def pretty_print(json_str):
    try:
        data = json.loads(json_str)
        print(json.dumps(data, indent=2, ensure_ascii=False))
    except ValueError as e:
        print(f"无效JSON: {e}\n原始内容:\n{json_str}")

# 测试
pretty_print('{"name": "Bob", "age": 25}')

9.2 常见错误处理

错误类型原因解决方案
JSONDecodeError格式错误/编码问题检查引号配对/设置ensure_ascii
TypeError包含不可序列化对象实现自定义encoder
RecursionError对象循环引用使用__dict__转换
MemoryError数据量过大使用流式处理

十、扩展生态系统

10.1 高效替代库

库名称特点安装命令
ujson超快序列化(4x速度)pip install ujson
orjson支持datetime/二进制pip install orjson
simplejson更严格的RFC合规pip install simplejson

10.2 可视化工具推荐

  1. jq​:命令行JSON处理器 echo '{"name":"Alice"}' | jq '.name'
  2. JSON Crack​:图形化展示工具
  3. VS Code插件​:JSON Viewer

通过本指南,您已掌握Python处理JSON的完整技能栈。关键实践建议:

  1. 生产环境优先使用orjson获得最佳性能
  2. 数据验证必须实施JSON Schema
  3. 敏感数据需进行深度过滤
  4. 大文件处理采用流式解析
  5. 跨格式转换注意类型映射关系

附:性能优化检查清单

graph LR
    A[JSON处理] --> B[选择合适库]
    A --> C[使用生成器]
    A --> D[避免重复解析]
    A --> E[预编译模式]
© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞74 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容