DynamoDB 能儲存 JSON 嗎?
可以。DynamoDB 能把 JSON 對應到它的文件型別來儲存:物件用 map(M),陣列用 list(L),最多可巢狀 32 層。每個項目最多 400 KB。DynamoDB 的型別系統是 JSON 的超集合,所以任何 JSON 文件都能存成一個項目,然後被過濾、更新與讀取。
JSON 如何對應到 DynamoDB 型別
- JSON 物件 → Map (M)
- JSON 陣列 → List (L)
- 字串/數字/布林/null → S / N / BOOL / NULL
list 與 map 最多可巢狀 32 層,所以一整份 JSON 文件會變成一個項目。
儲存後的大小比 JSON 更小
那個帶型別標記的線路格式看起來很浪費,於是大家假設自己是照它計費的。並不是。DynamoDB 是按項目大小計費,也就是每個屬性名稱加上每個值的總和,完全不含 JSON 的引號、冒號、逗號或大括號。
一份有九個屬性的訂單文件,帶一個巢狀地址、一個兩行的項目陣列與一個兩元素的標籤 list,用三種方式量測:
| 量測方式 | 位元組 |
|---|---|
| 線路上送出的 DynamoDB JSON | 607 |
| 同一份文件的最小化純 JSON | 447 |
| 計費的項目大小 | 350 |
所以儲存後的項目比你一開始那份 JSON 小 22%,比承載它的那個請求小 42%。數字做了大部分的工:149.97 存起來大約是 4 個位元組,而文字形式是 6 個字元。字串與名稱是精確計算的;AWS 記載的數字編碼大約是每兩位有效數字一個位元組,所以請把 350 當成準確到幾個位元組、而不是準確到個位數。
真正會花你錢的是命名。屬性名稱與 map 的 key 佔了那 350 個位元組中的 148 個,也就是項目的 42%,而且每一份副本你都得付。把 shippingAddress 縮短成 addr,橫跨十億個項目就是實實在在的節省。你可以在項目大小計算機裡量任何文件的大小,我們也拿它對照過引擎自己的計費界線:它算成 1,024 位元組的項目消耗一個寫入單位,1,025 則消耗兩個。
JSON 在這趟來回中會失去什麼
DynamoDB 以 38 位精度的十進位數儲存數字,所以一個 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 很重要,就把它們存成字串。
有兩種 JSON 文件 DynamoDB 根本不收:空的 key({"": "x"} 會引發 ValidationException: Empty attribute name,巢狀 map 裡也同樣適用),以及超過精度上限的數字,它會引發 ValidationException: DynamoDB only supports precision up to 38 digits。
唯一的附帶說明
DynamoDB 的型別是 JSON 型別的超集合。Binary(B)與 Set(SS/NS/BS)屬性沒有直接對應的 JSON 形式,所以當你轉回純 JSON 時,set 會序列化成陣列,binary 則變成 base64。
實際使用
你可以直接對巢狀的 JSON 屬性操作 — 對某個 map 欄位過濾、更新 list 中的一個元素 — 而不必重寫整個項目。
深入了解
請見 DynamoDB JSON 與 marshalling,並用 JSON 轉換器在純 JSON 與 DynamoDB JSON 之間轉換。下載 DynoTable 即可以視覺化方式編輯 JSON 項目。
參考資料
- 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 量測並重現。那三個位元組數字來自我們自己的項目大小計算機與序列化後的請求;數字的來回結果與兩個 ValidationException 字串,是透過 @aws-sdk/client-dynamodb 3.1095.0 從 DynamoDB Local 3.3.0 取得的逐字輸出,其訊息措辭可能與線上服務不同。