gpt4 book ai didi

mysql - 解析 Json - 从 sql (Aurora) 到 aws lambda

转载 作者:行者123 更新时间:2023-11-29 17:47:44 25 4
gpt4 key购买 nike

我无法解析从 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

最佳答案

您无法通过这种方式将 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 将反序列化整个事件结构。

关于mysql - 解析 Json - 从 sql (Aurora) 到 aws lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49670679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com