はじめに
DynamoDBに登録したデータをLambdaで取得して返却しようとしたときに
"Object of type 'Decimal' is not JSON serializable"とエラーが出てしまいました。
Dynamo側から取得したデータを見ると数値がDecimal型になっており、Decimal型はjson.dumpsできないみたいです。
今回は整数で表現できるものは整数、実数値は実数値に変換したかったのでそのように処理を追加しました。
本題
下記が対象のコードです。
対象のデータを一度整数に変換して変換前のデータと比較して一致した場合、つまり小数点以下が0の場合はint、違う場合はfloatに変換して返却するようにしました。
main.py
import json
import boto3
from decimal import Decimal
def lambda_handler(event, context):
try:
def decimal_transform(obj):
if isinstance(obj, Decimal):
return int(obj) if int(obj) == obj else float(obj)
dynamodb = boto3.resource("dynamodb", region_name='ap-northeast-1')
table = dynamodb.Table("table_name")
response = table.get_item(
Key={
'key': 'key_name'
}
)
return {
'statusCode':200,
'body': json.dumps(response, default=decimal_transform),
}
except Exception as e:
print(e)
return {
'statusCode':500,
'body': json.dumps('server faild'),
}
おわりに
DynamoからDecimalが返ってくることも、Decimalにjson.dumpsが使えないことも知らなかったので意外なところで時間を使ってしまいました。
同じ問題が発生した人に助けになれば幸いです。