猿问

如何使用 Python 从 AWS Lambda 检索格式正确的 JSON

我在 AWS Lambda 中有一个函数,它连接到 Twitter API 并返回与我通过事件提供的特定搜索查询匹配的推文。该函数的简化版本如下。我使用了一些辅助函数get_secret来管理 API 密钥,process_tweet它们限制了发回的数据,并执行诸如将创建日期转换为字符串之类的操作。最终结果是我应该取回字典列表。


def lambda_handler(event, context):

    twitter_secret = get_secret("twitter")


    auth = tweepy.OAuthHandler(twitter_secret['api-key'],

                               twitter_secret['api-secret'])

    auth.set_access_token(twitter_secret['access-key'],

                          twitter_secret['access-secret'])

    api = tweepy.API(auth)


    cursor = tweepy.Cursor(api.search,

                           q=event['search'],

                           include_entities=True,

                           tweet_mode='extended',

                           lang='en')


    tweets = list(cursor.items())

    tweets = [process_tweet(t) for t in tweets if not t.retweeted]


    return json.dumps({"tweets": tweets})

然后在我的桌面上,我有调用 lambda 函数的代码。


aws_lambda = boto3.client('lambda', region_name="us-east-1")

payload = {"search": "paint%20protection%20film filter:safe"}

lambda_response = aws_lambda.invoke(FunctionName="twitter-searcher",

                                    InvocationType="RequestResponse",

                                    Payload=json.dumps(payload))

results = lambda_response['Payload'].read()

tweets = results.decode('utf-8')

问题是json.dumps在 lambda 中输出输出和在 Python 中读取有效负载之间的某个地方,数据变得很糟糕。例如,一个应该\n变成的换行符\\\\n,所有的双引号都存储为\\"并且 Unicode 字符都以 为前缀\\。所以,当我的桌面上的 Python 接收到转义字符时,所有被转义的东西。考虑返回的列表的这个元素(手动格式化)。


'{\\"userid\\": 190764134,

  \\"username\\": \\"CapitalGMC\\",

  \\"created\\": \\"2018-09-02 15:00:00\\",

  \\"tweetid\\": 1036267504673337344,

  \\"text\\": \\"Protect your vehicle\'s paint! Find out how on this week\'s blog.

              \\\\ud83d\\\\udc47\\\\n\\\\nhttps://url/XYMxPhVhdH https://url/mFL2Zv8nWW\\"}'

我可以使用正则表达式来解决一些问题(\\"和\\\\n),但 Unicode 很棘手,因为即使我匹配它,我如何用正确转义的字符替换它?当我在 R 中使用该aws.lambda包执行此操作时,一切都很好,没有奇怪的转义符。


我在桌面上做错了什么 AWS Lambda 的响应会导致数据乱码?


SMILET
浏览 268回答 2
2回答

繁星淼淼

在您的 lambda 函数中,您应该在响应正文中返回一个带有 JSON 对象的响应对象。# Lambda Functiondef get_json(event, context):    """Retrieve JSON from server."""    # Business Logic Goes Here.    response = {        "statusCode": 200,        "headers": {},        "body": json.dumps({            "message": "This is the message in a JSON object."        })    }    return response

动漫人物

不要使用 json.dumps()我有一个类似的问题,当我刚刚返回 "body": content 而不是 "body": json.dumps(content) 时,我可以轻松访问和操作我的数据。在此之前,我得到了一个看起来像 JSON 的奇怪形式,但它不是。
随时随地看视频慕课网APP

相关分类

Python
我要回答