Flask返回JSON报错:TypeError: set类型对象无法JSON序列化
解决Flask返回自定义JSON格式时的序列化报错
问题场景
用Python Flask开发后端,前端通过JavaScript的fetch请求接口,需要返回文件夹中的列表数据。尝试用f-string拼接字符串构造响应数据,代码如下:
backsend_data = f"'count':'{len(name_value_list)}'" list_count = 1 while list_count < len(name_value_list): backsend_data = backsend_data + f"'name{list_count}':'{name_value_list[list_count]}','info{list_count}':'{info_value_list[list_count]}','class{list_count}':'{class_value_list[list_count]}'"
报错信息
运行时触发以下错误:
Traceback (most recent call last): File "/home/kon/.local/lib/python3.10/site-packages/flask/app.py", line 1498, in __call__ return self.wsgi_app(environ, start_response) File "/home/kon/.local/lib/python3.10/site-packages/flask/app.py", line 1476, in wsgi_app response = self.handle_exception(e) File "/home/kon/.local/lib/python3.10/site-packages/flask_cors/extension.py", line 178, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) File "/home/kon/.local/lib/python3.10/site-packages/flask/app.py", line 1473, in wsgi_app response = self.full_dispatch_request() File "/home/kon/.local/lib/python3.10/site-packages/flask/app.py", line 882, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/kon/.local/lib/python3.10/site-packages/flask_cors/extension.py", line 178, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) File "/home/kon/.local/lib/python3.10/site-packages/flask/app.py", line 880, in full_dispatch_request rv = self.dispatch_request() File "/home/kon/.local/lib/python3.10/site-packages/flask/app.py", line 865, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] File "/home/kon/Documents/Programming/Listed/src/backend/backend.pyw", line 69, in submit return jsonify({backsend_data}) File "/home/kon/.local/lib/python3.10/site-packages/flask/json/__init__.py", line 170, in jsonify return current_app.json.response(*args, **kwargs) # type: ignore[return-value] File "/home/kon/.local/lib/python3.10/site-packages/flask/json/provider.py", line 214, in response f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype File "/home/kon/.local/lib/python3.10/site-packages/flask/json/provider.py", line 179, in dumps return json.dumps(obj, **kwargs) File "/usr/lib/python3.10/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/usr/lib/python3.10/json/encoder.py", line 201, in encode chunks = list(chunks) File "/usr/lib/python3.10/json/encoder.py", line 438, in _iterencode o = _default(o) File "/home/kon/.local/lib/python3.10/site-packages/flask/json/provider.py", line 121, in _default raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") TypeError: Object of type set is not JSON serializable
期望返回格式
希望返回的JSON结构如下:
{"count":"2", "name1":"example1", "info1":"example1", "class1":"example1", "name2":"example2", "info2":"example2", "class2":"example2"}
解决方案
报错原因
return jsonify({backsend_data})中,大括号直接包裹字符串会创建一个集合,而集合无法被JSON序列化,这是报错的直接原因。- 手动用f-string拼接JSON字符串容易出现格式错误(比如缺少逗号、引号不匹配),且维护性差。
正确代码实现
直接用Python字典构造数据,再交给jsonify处理(Flask会自动完成JSON序列化):
# 初始化响应字典,先设置count backsend_data = {'count': str(len(name_value_list))} # 遍历列表,填充对应字段(索引从1开始,和原逻辑一致) for list_count in range(1, len(name_value_list)): backsend_data[f'name{list_count}'] = name_value_list[list_count] backsend_data[f'info{list_count}'] = info_value_list[list_count] backsend_data[f'class{list_count}'] = class_value_list[list_count] # 直接返回字典给jsonify return jsonify(backsend_data)
额外说明
- 如果列表从索引0开始存储有效数据,把循环的
range(1, len(...))改成range(len(...)),同时字段名调整为name{list_count+1}即可保持name1、name2的命名格式。 jsonify会自动处理字典到JSON的转换,无需手动拼接字符串,避免格式错误。
内容的提问来源于stack exchange,提问作者kope0
相关产品推荐
相关产品推荐

