gzip_b64encode 重新引入使用 json.dumps 分隔符删除的反斜杠

问题描述 投票:0回答:1

我有一个带有 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 编码是否导致了这个问题,以及如何纠正? 谢谢

python lambda aws-api-gateway
1个回答
0
投票

我通过将 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)
  }
© www.soinside.com 2019 - 2024. All rights reserved.