Python JSON模块无法序列化date对象?已写处理代码仍报错求排查
问题排查与解决建议
核心错误原因
你已经编写了处理date/datetime序列化的format_item函数,也生成了处理后的result_list_serializable,但最终JSON序列化的还是原始的result_list——里面未处理的date/datetime对象直接触发了序列化失败。看这段关键代码:
else: result_list_serializable = [list(format_item(item) for item in tup) for tup in result_list] print('[RESULT SERIALIZER] :', result_list_serializable) return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'body': json.dumps(result_list) # 这里误用了原始未处理的列表 }
次要逻辑问题(format_item函数)
- 第一个判断
if item is None:里的isinstance(item, (Decimal, float))完全无效——item已经是None,不可能是Decimal或float类型,属于逻辑冗余。 - 最后
else分支的return "" if item is None else item多余,前面已经判断过item is None的情况,直接返回item即可。 - 类型判断顺序错误:
datetime是date的子类,先判断date会导致datetime对象被误判为date类型,无法进入专属处理逻辑。
修复步骤与代码修改
1. 修正序列化对象
把return语句里的result_list替换为处理后的result_list_serializable:
return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'body': json.dumps(result_list_serializable) # 使用处理后的可序列化列表 }
2. 修复format_item函数逻辑
调整类型判断顺序,清理冗余逻辑:
def format_item(item): if item is None: return "" elif isinstance(item, (Decimal, float)): return float(item) elif isinstance(item, datetime): if item.hour == 0 and item.minute == 0 and item.second == 0: return item.strftime('%Y-%m-%d') else: return item.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(item, date): return item.isoformat() else: return item
3. 可选优化:自定义JSON编码器
如果不想手动遍历处理每个元素,可以自定义JSON编码器,简化代码:
from json import JSONEncoder class DateTimeEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, datetime): if obj.hour == 0 and obj.minute == 0 and obj.second == 0: return obj.strftime('%Y-%m-%d') else: return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj, date): return obj.isoformat() elif isinstance(obj, (Decimal, float)): return float(obj) elif obj is None: return "" return JSONEncoder.default(self, obj)
使用时直接传入cls参数,无需手动生成result_list_serializable:
json.dumps(result_list, cls=DateTimeEncoder)
内容的提问来源于stack exchange,提问作者user3521180
相关产品推荐
相关产品推荐

