Python返回AJAX响应时set类型无法JSON序列化问题求解
问题原因
JSON 标准没有对应 Python 集合(set)类型的实现,Flask 的 jsonify 方法(底层调用 Python 标准 json 模块)无法序列化 set 对象,因此触发报错。
解决方案
你使用 set 做去重的逻辑不需要改动,只需要将去重后的 set 转换为 JSON 支持的类型即可,以下是两种常用方案:
方案1:将 set 转换为列表(推荐,兼容多 record_id 场景)
如果分组后可能存在多个不同的 record_id,直接把 set 转为列表即可,同时可以搭配 sorted 固定返回顺序,方便前端处理。
修改后的去重代码如下:
remove_duplicates = [{**l[0], 'record_id': sorted(set([x['record_id'] for x in l]))} if len(l:=list(v)) > 1 else {**l[0], 'record_id': [l[0]['record_id']]} for _, v in groupby(sorted(list_of_dict, key=func), key=func)]
该方案返回的结构示例如下,所有 record_id 统一为数组格式,避免前端解析时格式不一致出错:
list_of_dicts = [{'f_note':'text','record_id':[4691]},{'f_note':'sample','record_id':[4692]}] return jsonify(list_of_dicts)
方案2:提取 set 内的单个值(仅适用于单 record_id 场景)
如果你的业务逻辑保证每个分组去重后只有 1 个 record_id,可以直接取出 set 内的单个值,返回数值类型:
remove_duplicates = [{**l[0], 'record_id': next(iter(set([x['record_id'] for x in l])))} if len(l:=list(v)) > 1 else l[0] for _, v in groupby(sorted(list_of_dict, key=func), key=func)]
该方案返回的 record_id 为数值类型,和你原示例的逻辑保持一致,可直接序列化。
内容的提问来源于stack exchange,提问作者sruthi
相关产品推荐
相关产品推荐

