本文目录导读:

- 从Python字典生成JSON
- 从列表生成JSON
- 从类对象生成JSON(使用类的dict)
- 自定义JSON序列化(复杂对象)
- 将JSON写入文件
- 生成嵌套JSON数据
- 使用json.dumps()的常用参数
- 生成JSON时的错误处理
- 常用技巧
在Python中生成JSON数据非常简单,主要使用内置的json模块,以下是常用的几种方法:
从Python字典生成JSON
import json
# 创建一个Python字典
data = {
"name": "张三",
"age": 28,
"city": "北京",
"skills": ["Python", "Java", "SQL"],
"is_student": False,
"scores": {
"math": 95,
"english": 88
}
}
# 将字典转换为JSON字符串
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
从列表生成JSON
import json
# 创建包含多个对象的列表
users = [
{"id": 1, "name": "张三", "age": 28},
{"id": 2, "name": "李四", "age": 32},
{"id": 3, "name": "王五", "age": 25}
]
# 生成JSON字符串
json_str = json.dumps(users, ensure_ascii=False, indent=2)
print(json_str)
从类对象生成JSON(使用类的dict)
import json
class User:
def __init__(self, name, age, email):
self.name = name
self.age = age
self.email = email
# 创建用户实例
user = User("张三", 28, "zhangsan@example.com")
# 使用__dict__转换为字典再生成JSON
json_str = json.dumps(user.__dict__, ensure_ascii=False, indent=2)
print(json_str)
自定义JSON序列化(复杂对象)
import json
from datetime import datetime
class Product:
def __init__(self, name, price, created_at):
self.name = name
self.price = price
self.created_at = created_at
# 自定义JSON编码器
class ProductEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Product):
return {
"name": obj.name,
"price": obj.price,
"created_at": obj.created_at.strftime("%Y-%m-%d %H:%M:%S")
}
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
return super().default(obj)
# 创建产品对象
product = Product("笔记本电脑", 5999.00, datetime.now())
# 使用自定义编码器生成JSON
json_str = json.dumps(product, cls=ProductEncoder, ensure_ascii=False, indent=2)
print(json_str)
将JSON写入文件
import json
data = {
"company": "技术公司",
"employees": [
{"name": "张三", "position": "工程师"},
{"name": "李四", "position": "设计师"}
]
}
# 写入JSON文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("JSON文件已保存")
生成嵌套JSON数据
import json
# 构建复杂的嵌套JSON
order_data = {
"order_id": "ORD-2023-001",
"customer": {
"name": "张三",
"contact": {
"phone": "13800138000",
"email": "zhangsan@email.com"
}
},
"items": [
{
"product_id": "P001",
"name": "商品A",
"quantity": 2,
"price": 99.9
},
{
"product_id": "P002",
"name": "商品B",
"quantity": 1,
"price": 199.9
}
],
"total_amount": 399.7,
"order_date": "2023-12-01",
"status": "pending"
}
# 生成格式化的JSON
json_str = json.dumps(order_data, ensure_ascii=False, indent=2)
print(json_str)
使用json.dumps()的常用参数
import json
data = {"name": "测试", "value": None, "count": 42}
# 不同参数的效果
print("1. 紧凑格式:")
print(json.dumps(data))
print("\n2. 美化格式 (indent=2):")
print(json.dumps(data, indent=2))
print("\n3. 排序键 (sort_keys=True):")
print(json.dumps(data, indent=2, sort_keys=True))
print("\n4. 跳过None值 (skipkeys=True):")
print(json.dumps(data, skipkeys=True, indent=2))
print("\n5. 分离符特殊设置:")
print(json.dumps(data, indent=2, separators=(',', ': ')))
生成JSON时的错误处理
import json
def safe_json_generate(data, **kwargs):
"""安全生成JSON数据"""
try:
json_str = json.dumps(data, ensure_ascii=False, indent=2, **kwargs)
# 验证JSON是否有效
json.loads(json_str)
return json_str
except (TypeError, ValueError) as e:
print(f"JSON生成错误: {e}")
return None
# 测试
valid_data = {"name": "测试", "value": 123}
invalid_data = {1: "test"} # 键不是字符串
print(safe_json_generate(valid_data))
print(safe_json_generate(invalid_data)) # 会报错
常用技巧
import json
# 1. 动态生成JSON
def create_json_from_template(**kwargs):
template = {
"metadata": {
"version": "1.0",
"timestamp": None
},
**kwargs
}
return json.dumps(template, ensure_ascii=False, indent=2)
# 2. 批量生成JSON数据
def batch_create_users(num_users):
users = []
for i in range(num_users):
users.append({
"id": i + 1,
"name": f"用户{i+1}",
"email": f"user{i+1}@example.com"
})
return json.dumps(users, ensure_ascii=False, indent=2)
# 使用示例
print(create_json_from_template(name="测试", value=123))
print(batch_create_users(3))
这些方法覆盖了Python中生成JSON数据的常见场景,你可以根据实际需求选择合适的方法。