Я следил за руководством, размещенным здесь, на YouTube https://thewikihow.com/video_jgiZ9QUYqyM, и демонстративно то, что я хочу. Я разместил код, который у меня был, и изображение того, как все выглядит в моем AWS.
У меня есть таблица Dynamodb, и я связал ее с моим ведром s3 с помощью триггера. Этот триггер выдает мне сообщение об ошибке, которое опубликовано выше. «Десятичное число ('1') не сериализуемо в формате JSON». Хотя тестировал с helloworld.
Это код:
import boto3
import json
import os
s3 = boto3.client('s3')
ddb = boto3.resource('dynamodb')
table = ddb.Table('test_table')
def lambda_handler(event, context):
response = table.scan()
body = json.dumps(response['Items'])
response = s3.put_object(Bucket='s3-testing',
Key = 's3-testing.json' ,
Body=body,
ContentType='application/json')
Может ли кто-нибудь указать мне правильное направление? Это фрагменты, которые я получил
https://i.stack.imgur.com/I0jAn.png
https://i.stack.imgur.com/2hMc9.png
Это журнал выполнения:
Response:
{
"stackTrace": [
[
"/var/task/lambda_function.py",
20,
"lambda_handler",
"body = json.dumps(response['Items'])"
],
[
"/usr/lib64/python2.7/json/__init__.py",
244,
"dumps",
"return _default_encoder.encode(obj)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
207,
"encode",
"chunks = self.iterencode(o, _one_shot=True)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
270,
"iterencode",
"return _iterencode(o, 0)"
],
[
"/usr/lib64/python2.7/json/encoder.py",
184,
"default",
"raise TypeError(repr(o) + \" is not JSON serializable\")"
]
],
"errorType": "TypeError",
"errorMessage": "Decimal('1') is not JSON serializable"
}
Журнал функций:
START RequestId: 31719509-94c7-11e8-a0d4-a9b76b7b212c Version: $LATEST
Decimal('1') is not JSON serializable: TypeError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 20, in lambda_handler
body = json.dumps(response['Items'])
File "/usr/lib64/python2.7/json/__init__.py", line 244, in dumps
return _default_encoder.encode(obj)
File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/lib64/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('1') is not JSON serializable
Я только что опубликовал весь ответ





Проблема в том, что библиотека Dynamo Python преобразует числовые значения в объекты Decimal, но по умолчанию они не сериализуемы JSON, поэтому json.dumps взрывается. Вам нужно будет предоставить json.dumps конвертер для объектов Decimal.
Десятичный объект не является сериализуемым в формате json. Рассмотрение преобразования Decimal в число с плавающей запятой с помощью вспомогательной функции. (json.dumps () принимает функцию по умолчанию)
import boto3
import json
import os
from decimal import Decimal
s3 = boto3.client('s3')
ddb = boto3.resource('dynamodb')
table = ddb.Table('test_table')
def lambda_handler(event, context):
response = table.scan()
body = json.dumps(response['Items'], default=handle_decimal_type)
response = s3.put_object(Bucket='s3-testing',
Key = 's3-testing.json' ,
Body=body,
ContentType='application/json')
def handle_decimal_type(obj):
if isinstance(obj, Decimal):
if float(obj).is_integer():
return int(obj)
else:
return float(obj)
raise TypeError
Где вы получаете здесь «Decimal (1) is not JSON serializable»? может весь ответ наклеить?