简介:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于 Web 开发和 API 交互。本文将详细介绍 JSON 数据的格式化、解析以及常见问题的解决方案。
一、JSON 基础知识
JSON 支持以下数据类型:
- 对象(Object):键值对集合,用花括号
{}表示 - 数组(Array):有序值列表,用方括号
[]表示 - 字符串(String):用双引号
""包围的文本 - 数字(Number):整数或浮点数
- 布尔值(Boolean):
true或false - null:表示空值
二、JSON 格式化的重要性
良好的 JSON 格式化可以带来以下好处:
- 提高代码可读性
- 便于调试和排查问题
- 减少数据传输错误
- 提升团队协作效率
三、Python 中的 JSON 处理
3.1 基本序列化和反序列化
import json
# Python 对象转 JSON 字符串
data = {
"name": "张三",
"age": 25,
"skills": ["Python", "JavaScript", "SQL"],
"active": True
}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
# JSON 字符串转 Python 对象
parsed_data = json.loads(json_str)
print(parsed_data["name"])
3.2 处理文件
import json
# 写入 JSON 文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(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)
四、JSON 格式化技巧
4.1 缩进控制
# 紧凑格式(无缩进)
json_str = json.dumps(data, separators=(',', ':'))
# 标准格式(2 空格缩进)
json_str = json.dumps(data, indent=2)
# 宽松格式(4 空格缩进)
json_str = json.dumps(data, indent=4)
4.2 键排序
# 按键名排序
json_str = json.dumps(data, sort_keys=True, indent=2)
4.3 处理中文字符
# 保留中文字符(不转义)
json_str = json.dumps(data, ensure_ascii=False, indent=2)
# 转义中文字符
json_str = json.dumps(data, ensure_ascii=True, indent=2)
五、常见问题处理
5.1 处理日期时间
import json
from datetime import datetime
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "张三",
"created_at": datetime.now()
}
json_str = json.dumps(data, cls=DateTimeEncoder, ensure_ascii=False, indent=2)
print(json_str)
5.2 处理自定义对象
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def to_dict(self):
return {"name": self.name, "age": self.age}
user = User("李四", 30)
json_str = json.dumps(user.to_dict(), ensure_ascii=False, indent=2)
print(json_str)
5.3 处理大数据
import json
# 流式处理大文件
def process_large_json(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
data = json.loads(line)
# 处理每一行数据
yield data
# 使用生成器处理
for item in process_large_json('large_data.json'):
print(item)
六、JSON 数据验证
6.1 基本验证
import json
def validate_json(json_str):
try:
json.loads(json_str)
return True
except json.JSONDecodeError as e:
print(f"JSON 格式错误: {e}")
return False
# 使用示例
valid_json = '{"name": "张三", "age": 25}'
invalid_json = '{"name": "张三", "age": }'
print(validate_json(valid_json)) # True
print(validate_json(invalid_json)) # False
6.2 Schema 验证
import json
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "number", "minimum": 0},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "age"]
}
data = {
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
try:
validate(instance=data, schema=schema)
print("数据验证通过")
except ValidationError as e:
print(f"验证失败: {e.message}")
七、使用 EasySpider 在线工具
EasySpider 提供了强大的 JSON 格式化工具:
- 支持多种数据格式输入(JSON、键值对、自定义分隔符)
- 自动检测和修复常见格式错误
- 语法高亮显示
- 树形视图展示
- 支持折叠和展开节点
- 一键复制格式化结果
使用技巧:
- 粘贴 JSON 数据后自动格式化
- 点击节点前的箭头可折叠/展开
- 支持大文件处理(建议分批处理)
- 错误位置会高亮显示
八、性能优化建议
- 对于频繁的序列化操作,考虑使用
orjson等高性能库 - 大文件处理时使用流式读取
- 避免重复解析相同数据
- 合理使用缓存机制
九、安全注意事项
安全提示:
- 不要直接解析来自不可信来源的 JSON
- 验证数据类型和范围
- 限制解析深度,防止栈溢出
- 敏感数据加密后再序列化
总结
掌握 JSON 格式化和解析技巧是每个开发者的必备技能。通过本文的学习,你应该能够:
- 理解 JSON 的数据结构和语法
- 熟练使用 Python 处理 JSON 数据
- 处理各种复杂场景和边界情况
- 使用 EasySpider 在线工具提高效率
- 遵循最佳实践确保代码质量