我有一个带有 lambda 代理集成的 api 网关,我启用了 gzip_b64encode 来压缩 lambda 端的有效负载(从 S3 中提取)。在添加之前,我的输出没有反斜杠,但这样做之后,它们又出现了。 这是输出的样子:
[{\"Exchange\":\"TSE\",\"Ticker\":1301,\"Name\":\"Kyokuyo\",\"Country\":\"Japan\",\"Currency\":\"JPY\",\"Asset_Type\":\"Common Stock\",\"ISIN\":\"JP3257200000\",\"Date\":\"4/30/2023\",\"Open\":3580.0,\"High\":3590.0,\"Low\":3545.0,\"Close\":3560.0,\"Volume\":20800,
这是我的代码:
import json
from io import BytesIO
import base64
import gzip
import awswrangler as wr
import boto3
def gzip_b64encode(data):
compressed = BytesIO()
with gzip.GzipFile(fileobj=compressed, mode='w') as f:
json_response = json.dumps(data)
f.write(json_response.encode('utf-8'))
return base64.b64encode(compressed.getvalue()).decode('ascii')
def lambda_handler(event, context):
print(event)
s3 = boto3.client('s3')
bucket_name = 'tse-candles'
format = event['queryStringParameters']['fmt']
day = event['queryStringParameters']['date']
A = '123.csv'
full_path = f"s3://{bucket_name}"
if day == 'today':
raw_df = wr.s3.read_csv(path=f'{full_path}/{A}', use_threads=True)
if format == 'json':
df = raw_df.to_json(orient="records")
parsed = json.loads(df)
parsed_w_separators = json.dumps(parsed, separators=(',', ':'))
return {
"isBase64Encoded": True,
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
'Content-Encoding': 'gzip'
},
'body': gzip_b64encode(parsed_w_separators)
}
有人能告诉我 gzip 编码是否导致了这个问题,以及如何纠正? 谢谢
我通过将 json.dumps 分隔符移动到定义 gzip 编码的顶部来解决它。我还在那里添加了 indent=4,它使我的输出变得完美。
def gzip_b64encode(data):
compressed = BytesIO()
with gzip.GzipFile(fileobj=compressed, mode='w') as f:
json_response = json.dumps(data, indent=4, separators=(',', ':'))
f.write(json_response.encode('utf-8'))
return base64.b64encode(compressed.getvalue()).decode('ascii')
我还在脚本的下方评论了引用,并对顶部已经正确格式化的数据帧进行了编码。
df = raw_df.to_json(orient="records")
parsed = json.loads(df)
#parsed_w_separators = json.dumps(parsed, separators=(',', ':'))
#parsed_w_separators = json.dumps(parsed, sort_keys=True, indent=4, separators=(',', ':'))
return {
"isBase64Encoded": True,
"statusCode": 200,
"headers": {
"Content-Type": "application/json",
'Content-Encoding': 'gzip'
},
'body': gzip_b64encode(parsed)
}