DynamoDB は JSON を保存できますか?
保存できます。DynamoDB は JSON をドキュメント型に対応づけて格納します。オブジェクトはマップ (M)、配列はリスト (L) で、32 階層までネストできます。1 アイテムは最大 400 KB です。DynamoDB の型システムは JSON の上位集合なので、どんな JSON ドキュメントもアイテムとして保存し、フィルターし、更新し、読み取ることができます。
JSON が DynamoDB の型にどう対応するか
- JSON のオブジェクト → マップ (M)
- JSON の配列 → リスト (L)
- 文字列 / 数値 / 真偽値 / null → S / N / BOOL / NULL
リストとマップは 32 階層までネストできるので、JSON ドキュメント 1 つがそのまま 1 アイテムになります。
保存されるサイズは JSON より小さい
型タグ付きの転送フォーマットは無駄が多そうに見えるので、その分まで課金されると思われがちです。そうではありません。DynamoDB が課金の基準にするのはアイテムサイズであり、それは各属性名と各値の合計で、JSON のクォート、コロン、カンマ、波かっこは含みません。
ネストされた住所、2 行のアイテム配列、2 要素のタグリストを持つ、属性 9 つの注文ドキュメントを 3 通りの方法で測ると、こうなります。
| 測り方 | バイト数 |
|---|---|
| 転送される DynamoDB JSON | 607 |
| 同じドキュメントを素の最小化 JSON で | 447 |
| 課金対象のアイテムサイズ | 350 |
つまり保存されるアイテムは、出発点の JSON より 22% 小さく、それを運んだリクエストより 42% 小さいのです。仕事の大半をしているのは数値です。149.97 はテキストなら 6 文字ですが、格納は約 4 バイトです。文字列と名前は正確に数えられます。AWS は数値のエンコードを、おおよそ有効数字 2 桁につき 1 バイトと文書化しているので、350 は 1 バイト単位ではなく数バイトの精度と読んでください。
代償を払うことになるのは命名です。属性名とマップのキーがその 350 バイトのうち 148 バイト、アイテムの 42% を占め、コピーのたびにそれを支払います。10 億件のアイテムにわたって shippingAddress を addr に縮めるのは、本物の節約です。任意のドキュメントのサイズはアイテムサイズ計算ツールで測れます。これはエンジン自身の課金境界に照らして確認済みで、この計算で 1,024 バイトとなるアイテムは書き込みユニットを 1 つ、1,025 バイトなら 2 つ消費します。
往復で JSON が失うもの
DynamoDB は数値を 38 桁の精度の 10 進数として保存するので、JSON の数値は保存されるのではなく正規化されます。書き込んですぐ読み戻すと、こうなります。
{"price": 19.90} -> {"price": {"N": "19.9"}}
{"qty": 1.0} -> {"qty": {"N": "1"}}
{"limit": 1e5} -> {"limit": {"N": "100000"}}
{"id": 9007199254740993} -> {"id": {"N": "9007199254740993"}}最後の行が役に立つところです。DynamoDB はその整数を正確に保持しますが、Node で JSON.parse('{"id":9007199254740993}') を実行すると 9007199254740992 が返ります。ID が重要なら、文字列として保存してください。
DynamoDB がまったく受け付けない JSON ドキュメントが 2 つあります。空のキー({"": "x"} は ValidationException: Empty attribute name を投げ、ネストされたマップの中でも同じです)と、精度の上限を超えた数値(ValidationException: DynamoDB only supports precision up to 38 digits を投げます)です。
唯一の注意点
DynamoDB の型は JSON の型の上位集合です。Binary (B) とセット (SS/NS/BS) の属性には直接対応する JSON がないので、素の JSON に戻すときセットは配列に、バイナリは base64 にシリアライズされます。
扱い方
ネストされた JSON の属性は、アイテム全体を書き直すことなく直接操作できます。マップのフィールドでフィルターしたり、リストの 1 要素だけ更新したり、といった具合です。
さらに詳しく
DynamoDB JSON とマーシャリングを参照し、素の JSON と DynamoDB JSON の変換は JSON コンバーターで行ってください。JSON のアイテムをビジュアルに編集するには DynoTable をダウンロードしてください。
参考資料
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB Update – JSON, Expanded Free Tier, Flexible Scaling, Larger Items — AWS News Blog
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-28 に測定・再現しました。3 つのバイト数は当サイトのアイテムサイズ計算ツールとシリアライズ済みリクエストから得たもので、数値の往復と 2 つの ValidationException の文字列は @aws-sdk/client-dynamodb 3.1095.0 経由の DynamoDB Local 3.3.0 のそのままの出力です。その文言は実稼働サービスと異なる場合があります。