【问题标题】:Parsing Json - from sql (Aurora) to aws lambda解析 Json - 从 sql (Aurora) 到 aws lambda
【发布时间】:2018-04-05 10:57:30
【问题描述】:

我无法解析从 sql 到 lambda 的 json。可以说下面是我调用 lambda api 的存储过程。

CALL mysql.lambda_async('arn:aws:lambda:us-east-1:<account_id>:function:<sample_name>',  <---- this should be your lambda function ARN
     CONCAT('{ "message_id" : "', 'test.txt', 
            '", "transaction_json" : "', '{"glossary": {
                                                "title": "example glossary",
                                                    "GlossDiv": {
                                                        "title": "S",
                                                        "GlossList": {
                                                            "GlossEntry": {
                                                                "ID": "SGML",
                                                                "SortAs": "SGML",
                                                                "GlossTerm": "Standard Generalized Markup Language",
                                                                "Acronym": "SGML",
                                                                "Abbrev": "ISO 8879:1986",
                                                                "GlossDef": {
                                                                    "para": "A meta-markup language, used to create markup languages such as DocBook.",
                                                                    "GlossSeeAlso": ["GML", "XML"]
                                                                },
                                                                "GlossSee": "markup"
                                                            }
                                                        }
                                                    }}}',
                '", "s3_bucket" : "', 'br-gtosbx-gtps-data-useast-1-s3',
            '"}'));

现在这将调用一个用 python 3.6 编写的 lambda 函数

def s3_publish_message(event, context):
    import boto3
    import botocore
    import json

    s3 = boto3.client('s3')

    s3_bucket = event['s3_bucket']
    #transaction_json = event['transaction_json']
    try:
        event_str = str(json.dumps(event['transaction_json'])).encode("utf-8")
        print("s3 Load Completed")
    except Exception as err:
        print("Could not convert event to string for storage. Threw exception: {}".format(err))

    message_id = event['message_id']

    s3.put_object(ACL='private',
                        Body=event_str,
                        Bucket=s3_bucket,
                        StorageClass='STANDARD',
                        Tagging='test',
                        Key=message_id)

当我在 mysql 中运行存储过程时,出现以下错误。

Error Code: 1873. Lambda API returned error: Invalid Request Content. Could not parse request body into json: Unexpected character ('g' (code 103)): was expecting comma to separate Object entries  at [Source: [B@616b0a0f; line: 1, column: 55]

有什么办法可以解决这个问题,或者我们应该在没有 (") 的情况下发送 json

【问题讨论】:

    标签: mysql sql amazon-web-services aws-lambda amazon-aurora


    【解决方案1】:

    您不能以这种方式将 JSON 对象嵌入到 JSON 字符串中。你可以做到,但不是你做的方式。这种方式根本行不通。

    而且,你不应该这样做。

    JSON 是一种对象序列化 格式——它采用逻辑对象并以基于字符的字符串表示它们。它通常用于不同的系统之间,以允许通过一种介质(例如 HTTP)传输对象,该介质没有具有键/值对、数组和字符串的“对象”的内在概念。

    mysql.lambda_async() 的整个第二个参数是 JSON。你告诉它transaction_json 是一个字符串,而不是简单的嵌套对象。

    "transaction_json" : "{"glossary": ...
    

    这是错误的,因为如果它是一个字符串,那么它没有被正确编码为 JSON 字符串,因为 JSON 字符串不能包含未转义的 " 以及其他一些字符。

    但没有必要这样做。只需删除外部引号即可。

    将您传递给mysql.lambda_async() 的第二个参数的所有内容粘贴到http://jsonlint.com 之类的验证器中,您会发现它确实是无效的JSON。

    去掉transaction_json值周围的",对象就有效了。

    '", "transaction_json" : "', '{"glossary # old 
    '", "transaction_json" : {"glossary      # new
    

    ...和...

    '", "s3_bucket" : "', 'br-gtosbx-gtps-data-useast-1-s3', # old      
    ', "s3_bucket" : "', 'br-gtosbx-gtps-data-useast-1-s3',  # new
    

    而且,您在技术上错误地命名了该字段。它不是事务 JSON。它只是交易对象。外层容器是JSON,内层不是。

    去掉外引号后,event_str = str(json.dumps(event['transaction_json'])).encode("utf-8") 应该不需要了,因为event['transaction_json'] 已经是一个对象——Lambda 将反序列化整个事件结构。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 2019-10-25
      • 2020-01-25
      • 2021-09-28
      • 2021-02-12
      • 1970-01-01
      相关资源
      最近更新 更多