AWS Lambda Python返回结果JSON序列化错误及转义斜杠问题
问题根因
- 初始代码报错原因:
base64.b64encode()返回的是bytes类型数据,Python标准JSON序列化器不支持直接序列化bytes类型,因此触发序列化错误。另外你把处理后的字典直接用str()转换,得到的是Python风格的字典字符串(比如单引号包裹键值),不是标准JSON格式,本身也不符合数据输出要求。 - 修改后代码出现多余转义符原因:
payload本身已经是解码后的JSON字符串,你额外调用了json.dumps(payload),等于对字符串做了二次JSON序列化,因此会把原JSON里的双引号自动加上转义反斜杠。
修复方案
调整逻辑顺序:先把清洗后的字典转成标准JSON字符串,再做base64编码,最后把bytes类型的编码结果转成字符串即可,同时要把全局变量output挪到函数内部,避免Lambda实例复用时出现脏数据,正确代码如下:
import json import base64 import string from typing import Optional, Iterable, Union delete_dict = {sp_character: '' for sp_character in string.punctuation} PUNCT_TABLE = str.maketrans(delete_dict) # 保留你原有clean_keys的实现逻辑,这里补充完整可运行的基础版本 def clean_keys(pairs): cleaned_pairs = [] for k, v in pairs: cleaned_k = k.translate(PUNCT_TABLE) cleaned_pairs.append((cleaned_k, v)) return dict(cleaned_pairs) def lambda_handler(event, context): # 变量放到函数内部,避免全局复用导致的旧数据残留 output = [] for record in event['records']: payload = base64.b64decode(record['data']).decode('utf-8') # 清洗键名得到字典对象 remove_special_char = json.loads(payload, object_pairs_hook=clean_keys) # 字典转标准JSON字符串后加换行 row_w_newline = json.dumps(remove_special_char) + "\n" # base64编码后转成字符串,规避bytes无法序列化的问题 b64_data = base64.b64encode(row_w_newline.encode('utf-8')).decode('utf-8') output_record = { 'recordId': record['recordId'], 'result': 'Ok', 'data': b64_data } output.append(output_record) print('Processed {} records.'.format(len(event['records']))) return {'records': output}
内容的提问来源于stack exchange,提问作者Bokambo
相关产品推荐
相关产品推荐

