Help us understand the problem. What are the problem?

More than 5 years have passed since last update.


DynamoDB x Python / Decimal を登録する

JSON と Python のマッピング

JSON と Python の dict は以下のようにマッピングされている。

JSON Python
object dict
array list
string unicode
number (int) int, long
number(real) float
true True
false False
null None

そのため、JSON を json.loads() でパースして、そのまま dynamo.put_item() で登録すると前述の型で登録される。この際に float 型があると下記のように怒られる。

Float types are not supported. Use Decimal types instead.

Python の float はそのままでは DynamoDB に登録できないのである。
代わりに Decimal で登録する必要がある。

Float ではなく Decimal として登録するには?

Float を Decimal にマッピングさせる必要がある。

{"Timestamp": "20160323T203501.000+0900", "x": -0.279938, "y": -0.754028, "z": -0.607758 }

JSON をパースする際に下記のように parse_float=decimal.Decimal をつければよい。

import json
import boto3
import decimal
item = json.loads(json_data, parse_float=decimal.Decimal)
dynamo = boto3.resource('dynamodb').Table('ThisIsJustTest')
dynamo.put_item(Item = item)


Python 公式にも記載されていたが、ぐぐってもすぐに情報が出なかったので記事にした。

parse_float, if specified, will be called with the string of every JSON float to be decoded. By default, this is equivalent to float(num_str). This can be used to use another datatype or parser for JSON floats (e.g. decimal.Decimal).

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

AWS のドキュメントにもサラッとのっていた。

Decimal から戻すとき



Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
Help us understand the problem. What are the problem?