DynamoDB può memorizzare JSON?
Sì. DynamoDB può memorizzare JSON mappandolo sui suoi tipi documento: map (M) per gli oggetti e list (L) per gli array, annidati fino a 32 livelli. Ogni Item arriva a 400 KB. Il sistema di tipi di DynamoDB è un superset di JSON, quindi qualsiasi documento JSON può essere memorizzato come Item e poi filtrato, aggiornato e letto.
Come JSON si mappa sui tipi DynamoDB
- Oggetto JSON → Map (M)
- Array JSON → List (L)
- stringa / numero / booleano / null → S / N / BOOL / NULL
List e map possono annidarsi fino a 32 livelli, quindi un documento JSON completo diventa un solo Item.
La dimensione memorizzata è più piccola del JSON
Il formato di trasporto con i tag di tipo sembra uno spreco, e la gente presume di pagarlo. Non è così. DynamoDB addebita sulla dimensione dell'Item, che è la somma di ciascun nome di attributo più ciascun valore, senza nessuna delle virgolette, dei due punti, delle virgole o delle graffe del JSON.
Un documento d'ordine con nove attributi, un indirizzo annidato, un array di due righe d'ordine e una lista di due tag si misura in tre modi diversi:
| Misura | Byte |
|---|---|
| DynamoDB JSON così come viaggia sul filo | 607 |
| Lo stesso documento come JSON semplice minifiato | 447 |
| Dimensione dell'Item fatturata | 350 |
Quindi l'Item memorizzato è il 22% più piccolo del JSON da cui sei partito, e il 42% più piccolo della richiesta che l'ha trasportato. Sono i numeri a fare gran parte del lavoro: 149.97 occupa circa 4 byte contro 6 caratteri di testo. Stringhe e nomi sono conteggiati esattamente; AWS documenta la codifica dei numeri come circa un byte ogni due cifre significative, quindi leggi 350 come accurato a pochi byte e non al byte singolo.
Quello che ti costa davvero è la nomenclatura. I nomi degli attributi e le chiavi delle map valgono 148 di quei 350 byte, il 42% dell'Item, e li paghi su ogni copia. Accorciare shippingAddress in addr su un miliardo di Item è un risparmio reale. Puoi dimensionare qualsiasi documento nel calcolatore della dimensione degli Item, che abbiamo verificato rispetto al confine di fatturazione del motore stesso: gli Item che calcola a 1.024 byte consumano un'unità di scrittura, e 1.025 ne consumano due.
Cosa perde il JSON nel round trip
DynamoDB memorizza i numeri come decimali con 38 cifre di precisione, quindi un numero JSON viene normalizzato invece che preservato. Scritto e riletto subito dopo:
{"price": 19.90} -> {"price": {"N": "19.9"}}
{"qty": 1.0} -> {"qty": {"N": "1"}}
{"limit": 1e5} -> {"limit": {"N": "100000"}}
{"id": 9007199254740993} -> {"id": {"N": "9007199254740993"}}L'ultima riga è quella utile. DynamoDB mantiene l'intero esattamente, mentre JSON.parse('{"id":9007199254740993}') in Node ti dà 9007199254740992. Se gli ID contano, memorizzali come stringhe.
Due documenti JSON che DynamoDB non accetta proprio: una chiave vuota ({"": "x"} solleva ValidationException: Empty attribute name, e lo stesso vale dentro una map annidata) e un numero oltre il limite di precisione, che solleva ValidationException: DynamoDB only supports precision up to 38 digits.
L'unica avvertenza
I tipi di DynamoDB sono un superset di quelli di JSON. Gli attributi Binary (B) e Set (SS/NS/BS) non hanno un equivalente JSON diretto, quindi i set vengono serializzati in array e il binario in base64 quando riconverti in JSON semplice.
Lavorarci
Puoi operare direttamente sugli attributi JSON annidati — filtrare su un campo di una map, aggiornare un singolo elemento di una list — senza riscrivere l'intero Item.
Approfondisci
Vedi DynamoDB JSON e marshalling, e converti tra JSON semplice e DynamoDB JSON con il convertitore JSON. Scarica DynoTable per modificare gli Item JSON visivamente.
Riferimenti
- 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
Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.
Misurato e riprodotto il 2026-07-28. I tre conteggi in byte provengono dal nostro calcolatore della dimensione degli Item e dalla richiesta serializzata; i round trip dei numeri ed entrambe le stringhe ValidationException sono output alla lettera di DynamoDB Local 3.3.0 tramite @aws-sdk/client-dynamodb 3.1095.0, la cui formulazione dei messaggi può differire da quella del servizio live.