0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonでDecimal型をintとfloatに変換する

Posted at

はじめに

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が使えないことも知らなかったので意外なところで時間を使ってしまいました。
同じ問題が発生した人に助けになれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?