Разбор Json - от sql (Аврора) до aws лямбда

0

Я не могу разобрать json, как из sql в лямбда. Скажем ниже, это моя хранимая процедура, которая вызывает 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

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 без (")

Теги:
amazon-web-services
aws-lambda
aurora

1 ответ

0
Лучший ответ

Вы не можете встроить JSON-объект в строку JSON таким образом. Вы можете это сделать, но не так, как вы это делаете. Это просто не работает.

Но также вам не нужно.

JSON - это формат сериализации объекта - он принимает логические объекты и представляет их в символьной строке. Он обычно используется между разрозненными системами, позволяющими переносить объект через среду, подобную HTTP, - которая не имеет внутренней концепции "объекта" с парами ключ/значение, массивами и строками.

Весь ваш второй аргумент mysql.lambda_async() - JSON. Вы говорите, что transaction_json - это строка, а не просто вложенный объект.

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

Это неверно, потому что если это строка, то она не кодируется надлежащим образом как строка JSON, потому что строки JSON не могут содержать unescaped " а также некоторые другие символы.

Но это не нужно. Просто удалите внешние кавычки.

Возьмите все, что вы переходите ко второму аргументу в 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 будет deserialied всей структуры события.

  • 0
    спасибо Майкл -

Ещё вопросы

Сообщество Overcoder
Наверх
Меню