Python怎么打印JSON数据:从基础到实用技巧
在Python开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,因其轻量、易读、结构清晰被广泛应用于API接口、配置文件、数据存储等场景,当我们处理JSON数据时,经常需要将其打印到控制台或日志中以便调试、查看或展示,本文将详细介绍Python中打印JSON数据的多种方法,从基础到进阶,帮助你高效处理JSON数据的输出。
JSON数据在Python中的表示:json模块与字典/列表的转换
JSON数据本质上是字符串(如'{"name": "Alice", "age": 25}'),但在Python中,我们通常将其转换为字典(dict)或列表(list)以便操作,Python内置的json模块提供了序列化(将Python对象转为JSON字符串)和反序列化(将JSON字符串转为Python对象)的功能。
import json
# JSON字符串
json_str = '{"name": "Alice", "age": 25, "hobbies": ["reading", "coding"]}'
# 反序列化为Python字典
data = json.loads(json_str)
print(data) # 输出:{'name': 'Alice', 'age': 25, 'hobbies': ['reading', 'coding']}
这里的data是Python字典,后续的打印操作主要围绕这类Python对象展开。
基础打印方法:直接输出Python对象
如果只是简单查看JSON数据对应的Python对象(如字典、列表),可以直接使用print()函数直接输出:
import json
json_str = '{"name": "Bob", "city": "Shanghai", "scores": [90, 85, 92]}'
data = json.loads(json_str)
# 直接打印Python字典
print(data)
输出结果:
{'name': 'Bob', 'city': 'Shanghai', 'scores': [90, 85, 92]}
优缺点分析:
- 优点:简单直接,无需额外代码,适合快速调试。
- 缺点:当数据嵌套较深或字段较多时,输出结果可能不够直观,难以阅读(例如多层嵌套的字典会显示为一行长文本)。
格式化打印:json.dumps()实现“美观”输出
为了解决基础打印中“可读性差”的问题,json模块提供了json.dumps()方法(dumps = dump string),可以将Python对象格式化为易读的JSON字符串,核心参数是indent,用于指定缩进空格数,让输出结构更清晰。
基本格式化(带缩进)
import json
data = {
"name": "Charlie",
"details": {
"age": 30,
"city": "Beijing",
"contacts": {
"email": "charlie@example.com",
"phone": "13800138000"
}
},
"hobbies": ["swimming", "traveling", "photography"]
}
# 使用json.dumps()格式化,缩进4个空格
formatted_json = json.dumps(data, indent=4)
print(formatted_json)
输出结果:
{
"name": "Charlie",
"details": {
"age": 30,
"city": "Beijing",
"contacts": {
"email": "charlie@example.com",
"phone": "13800138000"
}
},
"hobbies": [
"swimming",
"traveling",
"photography"
]
}
其他常用参数增强可读性
-
ensure_ascii=False:默认情况下,json.dumps()会将非ASCII字符(如中文)转义为Unicode(如\u4e2d\u6587),设置ensure_ascii=False可保留原字符:data = {"name": "张三", "city": "北京"} print(json.dumps(data, indent=4, ensure_ascii=False))输出:
{ "name": "张三", "city": "北京" } -
sort_keys=True:对字典的键进行字母排序,输出更规整:data = {"name": "David", "age": 28, "city": "Guangzhou"} print(json.dumps(data, indent=4, sort_keys=True))输出:
{ "age": 28, "city": "Guangzhou", "name": "David" } -
separators:自定义分隔符,减少空格(适用于压缩JSON):data = {"name": "Eve", "age": 26} print(json.dumps(data, separators=(",", ":"))) # 无缩进,无多余空格输出:
{"name":"Eve","age":26}
进阶场景:处理复杂数据与特殊需求
打印JSON到文件(而非控制台)
如果需要将格式化的JSON数据保存到文件(如配置文件、数据导出),可以使用json.dump()(注意没有s,表示写入文件对象):
import json
data = {"name": "Frank", "data": [1, 2, 3], "metadata": {"version": "1.0"}}
# 写入文件(默认会覆盖,若追加需用'a'模式)
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
print("JSON数据已写入data.json文件")
执行后,当前目录会生成data.json为格式化后的JSON字符串。
处理自定义对象(如类实例)
如果Python对象是自定义类的实例,直接使用json.dumps()会报错(TypeError),需要通过default参数指定序列化方法,例如将对象转为字典:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Grace", 32)
# 自定义序列化函数:将对象转为字典
def serialize_object(obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 使用default参数传入自定义函数
print(json.dumps(person, default=serialize_object, indent=4))
输出:
{
"name": "Grace",
"age": 32
}
结合日志模块(logging)打印JSON
在项目中,通常使用logging模块替代print()记录日志,避免输出被重定向或丢失,打印JSON时,可直接将格式化后的字符串传入日志方法:
import json
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
data = {"level": "INFO", "message": "操作成功", "timestamp": "2023-10-01 12:00:00"}
# 格式化后记录日志
formatted_json = json.dumps(data, indent=4, ensure_ascii=False)
logging.info(f"JSON数据:\n{formatted_json}")
日志输出:
2023-10-01 12:00:00,123 - INFO - JSON数据:
{
"level": "INFO",
"message": "操作成功",
"timestamp": "2023-10-01 12:00:00"
}
常见问题与解决方案
中文显示为Unicode(如\u4e2d\u6587)
原因:json.dumps()默认ensure_ascii=True,会将非ASCII字符转义。
解决:添加ensure_ascii=False参数,如前文所述。
打印时出现TypeError: Object of type ... is not JSON serializable
原因:Python对象包含不可序列化的类型(如datetime、自定义类)。
解决:通过default参数自定义序列化逻辑,或提前将对象转为基本类型(如字典、字符串)。
大型JSON文件打印卡顿
原因:JSON数据量过大时,indent参数会导致字符串过长,内存占用高。
解决:
- 不使用
indent(即indent=None),输出压缩后的JSON; - 分块读取并打印(适用于文件流式处理);
- 使用第三方库(如
orjson,比标准库json更快)。
Python中打印JSON数据的方法灵活多样,可根据场景选择:
- 快速调试:直接
print()Python对象; - 可读性展示:`json.dumps(data, indent=4, ensure_ascii



还没有评论,来说两句吧...