本文目录导读:

- 方法1:使用
json.dumps()的indent参数(最常用) - 方法2:控制排序和缩进细节
- 方法3:格式化已存在的JSON字符串
- 方法4:保存格式化JSON到文件
- 方法5:使用
pprint模块(更友好的控制台输出) - 常用参数对比表
- 高级技巧:处理特殊数据类型
方法1:使用json.dumps()的indent参数(最常用)
import json
# 原始JSON字符串
data = {
"name": "Alice",
"age": 30,
"hobbies": ["reading", "coding", "hiking"],
"address": {
"city": "Beijing",
"district": "Haidian",
"zip": "100089"
}
}
# 将Python对象转换为格式化的JSON字符串
formatted_json = json.dumps(data, indent=4, ensure_ascii=False)
print(formatted_json)
输出效果:
{
"name": "Alice",
"age": 30,
"hobbies": [
"reading",
"coding",
"hiking"
],
"address": {
"city": "Beijing",
"district": "Haidian",
"zip": "100089"
}
}
方法2:控制排序和缩进细节
import json
data = {"b": 2, "a": 1, "c": 3}
# 按键排序,自定义缩进和分隔符
formatted = json.dumps(
data,
indent=2, # 缩进2个空格
sort_keys=True, # 按键名排序
separators=(',', ': '), # 自定义分隔符
ensure_ascii=False # 支持中文
)
print(formatted)
输出:
{
"a": 1,
"b": 2,
"c": 3
}
方法3:格式化已存在的JSON字符串
import json
# 假设你有一个未格式化的JSON字符串
ugly_json = '{"name":"Bob","score":95,"subjects":["Math","Physics"]}'
# 先解析为Python对象,再格式化输出
parsed = json.loads(ugly_json)
pretty = json.dumps(parsed, indent=4)
print(pretty)
输出:
{
"name": "Bob",
"score": 95,
"subjects": [
"Math",
"Physics"
]
}
方法4:保存格式化JSON到文件
import json
data = {
"database": "MySQL",
"port": 3306,
"tables": ["users", "orders"]
}
# 直接写入格式化的JSON文件
with open("config.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
生成的config.json内容:
{
"database": "MySQL",
"port": 3306,
"tables": [
"users",
"orders"
]
}
方法5:使用pprint模块(更友好的控制台输出)
import json
from pprint import pprint
data = {
"languages": ["Python", "Java", "C++"],
"version": {
"Python": 3.9,
"Java": 17
}
}
# 直接美化打印
pprint(data, indent=2, width=40)
输出:
{ 'languages': ['Python', 'Java', 'C++'],
'version': { 'Java': 17, 'Python': 3.9}}
常用参数对比表
| 参数 | 作用 | 示例值 |
|---|---|---|
indent |
缩进空格数 | 4 |
sort_keys |
是否按键排序 | True |
ensure_ascii |
是否转义非ASCII字符 | False |
separators |
自定义分隔符 | |
default |
处理特殊类型 | str |
高级技巧:处理特殊数据类型
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"event": "meeting",
"time": datetime.now(),
"attendees": 5
}
print(json.dumps(data, cls=CustomEncoder, indent=2))
输出:
{
"event": "meeting",
"time": "2024-03-15T14:30:00",
"attendees": 5
}
选择哪种方法取决于你的具体需求:
- 可视化调试:推荐
indent=4+ensure_ascii=False - 文件存储:使用
json.dump()搭配相同参数 - 处理复杂对象:需要自定义JSONEncoder