解析 Json - 从 sql (Aurora) 到 aws lambda
Parsing Json - from sql (Aurora) to aws lambda
我无法将 json 从 sql 解析为 lambda。让我们说下面是我调用 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 是一种 对象序列化 格式——它接受逻辑对象并在 character-based 字符串中表示它们。它通常在不同的系统之间使用,以允许通过一种介质(如 HTTP)传输对象,这种介质没有 "object" 与 key/value 对、数组和字符串的内在概念。
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 将反序列化整个事件结构。
我无法将 json 从 sql 解析为 lambda。让我们说下面是我调用 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 是一种 对象序列化 格式——它接受逻辑对象并在 character-based 字符串中表示它们。它通常在不同的系统之间使用,以允许通过一种介质(如 HTTP)传输对象,这种介质没有 "object" 与 key/value 对、数组和字符串的内在概念。
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 将反序列化整个事件结构。