Python中如何返回JSON数据:从基础到实践
在Web开发、API接口设计或数据交互场景中,JSON(JavaScript Object Notation)因其轻量级、易读性和跨语言兼容性,成为最常用的数据交换格式之一,Python内置了对JSON的强大支持,无论是将Python对象转换为JSON字符串返回,还是处理复杂的嵌套数据,都能通过简洁的代码实现,本文将详细介绍Python中返回JSON数据的多种方法,从基础语法到实际应用场景,帮助你全面这一技能。
Python与JSON:基础概念
JSON是一种基于文本的数据格式,采用键值对(Key-Value)的结构,类似于Python中的字典(dict)和列表(list),Python通过内置的json模块提供了JSON数据的编码(序列化)和解码(反序列化)功能:
- 序列化(Serialization):将Python对象(如dict、list、str、int等)转换为JSON字符串,这一过程称为“编码”(Encode),使用
json.dumps()方法。 - 反序列化(Deserialization):将JSON字符串解析为Python对象,这一过程称为“解码”(Decode),使用
json.loads()方法。
在Web开发中,“返回JSON数据”通常指将Python对象序列化为JSON字符串,并通过HTTP响应(如Flask、Django框架)返回给客户端(如浏览器、前端应用)。
核心方法:json.dumps()——Python对象转JSON字符串
json.dumps()(dump string)是Python中将对象转换为JSON字符串的核心方法,其基本语法为:
import json json_str = json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
常用参数解析:
obj:要序列化的Python对象(如dict、list、str等)。indent:指定缩进格式,用于美化输出(如indent=4,JSON字符串会自动换行并缩进,便于阅读)。ensure_ascii:是否确保输出为ASCII字符,默认为True,非ASCII字符(如中文)会被转义为\uXXXX;设为False可保留原字符(如中文直接显示)。sort_keys:是否对字典的键进行排序,默认为False,设为True时,JSON字符串中的键会按字母顺序排序(常用于测试或确保一致性)。default:自定义序列化函数,用于处理无法直接序列化的对象(如datetime、自定义类实例)。
示例1:基础序列化(字典转JSON)
import json
python_dict = {
"name": "张三",
"age": 25,
"is_student": False,
"courses": ["Python", "JavaScript"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
# 基本序列化(不格式化)
json_str = json.dumps(python_dict)
print(json_str)
# 输出(无缩进,非ASCII字符转义):
# {"name": "\u5f20\u4e09", "age": 25, "is_student": false, "courses": ["Python", "JavaScript"], "address": {"city": "\u5317\u4eac", "district": "\u6d77\u6dc0\u533a"}}
# 格式化输出(缩进4空格,保留中文)
json_str_formatted = json.dumps(python_dict, indent=4, ensure_ascii=False)
print(json_str_formatted)
# 输出(带缩进,中文保留):
# {
# "name": "张三",
# "age": 25,
# "is_student": false,
# "courses": [
# "Python",
# "JavaScript"
# ],
# "address": {
# "city": "北京",
# "district": "海淀区"
# }
# }
示例2:处理复杂对象(自定义序列化)
Python的json模块默认支持基本类型(dict、list、str、int、float、bool、None),但无法直接序列化复杂对象(如datetime、自定义类实例),此时可通过default参数自定义处理逻辑:
import json
from datetime import datetime
# 自定义序列化函数
def custom_serializer(obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S") # datetime转字符串
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 包含datetime的Python对象
data = {
"user": "李四",
"login_time": datetime.now()
}
# 使用default参数处理datetime
json_str = json.dumps(data, indent=4, default=custom_serializer, ensure_ascii=False)
print(json_str)
# 输出示例:
# {
# "user": "李四",
# "login_time": "2023-10-01 14:30:00"
# }
Web框架中返回JSON:从序列化到HTTP响应
在实际开发中,我们通常使用Web框架(如Flask、Django、FastAPI)构建API接口,并通过HTTP响应返回JSON数据,不同框架的实现方式略有差异,但核心逻辑一致:用json.dumps()序列化Python对象,再通过框架的响应机制返回。
Flask框架返回JSON
Flask提供了jsonify方法,它内部会自动调用json.dumps(),并设置正确的Content-Type头(application/json),推荐优先使用。
方式1:使用jsonify(推荐)
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/api/user")
def get_user():
user_data = {
"id": 1,
"name": "王五",
"roles": ["admin", "user"]
}
return jsonify(user_data) # 自动序列化并设置Content-Type
if __name__ == "__main__":
app.run(debug=True)
访问http://127.0.0.1:5000/api/user,响应为:
{
"id": 1,
"name": "王五",
"roles": [
"admin",
"user"
]
}
方式2:手动使用json.dumps()(需设置响应头)
from flask import Flask, Response
import json
app = Flask(__name__)
@app.route("/api/data")
def get_data():
data = {"status": "success", "message": "手动返回JSON"}
json_str = json.dumps(data, ensure_ascii=False)
return Response(json_str, mimetype="application/json") # 手动设置Content-Type
if __name__ == "__main__":
app.run(debug=True)
Django框架返回JSON
Django中可通过JsonResponse类返回JSON数据,它继承自HttpResponse,并自动处理序列化和Content-Type头。
方式1:使用JsonResponse(推荐)
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET"])
def get_product(request):
product_data = {
"id": 101,
"name": "笔记本电脑",
"price": 5999.00,
"in_stock": True
}
return JsonResponse(product_data) # 自动序列化,Content-Type=application/json
方式2:处理非字典数据(需设置safe=False)
JsonResponse默认只接受字典类型,若返回列表或其他类型,需设置safe=False:
from django.http import JsonResponse
def get_tags(request):
tags = ["Python", "Django", "JSON"]
return JsonResponse(tags, safe=False) # 返回列表,需设置safe=False
FastAPI框架返回JSON
FastAPI基于Python类型注解,内置了对JSON的支持,通过JSONResponse返回数据,或直接在函数中返回字典(FastAPI会自动序列化)。
方式1:直接返回字典(推荐)
from fastapi import FastAPI
app = FastAPI()
@app.get("/api/books")
def get_books():
books = [
{"id": 1, "title": "Python编程", "author": "John"},
{"id": 2, "title": "Flask开发", "author": "Jane"}
]
return books # FastAPI自动序列化为JSON
方式2:使用JSONResponse(自定义响应)
from fastapi import FastAPI, JSONResponse
app = FastAPI()
@app.get("/api/status")
def get_status():
data = {"code": 200, "message": "OK"}
return JSONResponse(content=data, status_code=200)
常见问题与解决方案
错误:TypeError: Object of type XXX is not JSON serializable
原因:尝试序列



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