DynamoDB peut-il stocker du JSON ?
Oui. DynamoDB peut stocker du JSON en le projetant sur ses types document : map (M) pour les objets et liste (L) pour les tableaux, imbriqués jusqu'à 32 niveaux de profondeur. Chaque élément contient jusqu'à 400 Ko. Le système de types de DynamoDB est un sur-ensemble de JSON : n'importe quel document JSON peut donc être stocké comme élément, puis filtré, modifié et lu.
Comment JSON se projette sur les types DynamoDB
- objet JSON → Map (M)
- tableau JSON → Liste (L)
- chaîne / nombre / booléen / null → S / N / BOOL / NULL
Listes et maps peuvent s'imbriquer jusqu'à 32 niveaux de profondeur, donc un document JSON complet devient un seul élément.
La taille stockée est plus petite que le JSON
Le format de transport typé a l'air gaspilleur, et les gens supposent qu'il leur est facturé. Ce n'est pas le cas. DynamoDB facture sur la taille de l'élément, c'est-à-dire la somme de chaque nom d'attribut plus chaque valeur, sans les guillemets, deux-points, virgules et accolades de JSON.
Un document de commande à neuf attributs, avec une adresse imbriquée, un tableau de deux lignes et une liste de deux tags, se mesure de trois façons différentes :
| Mesure | Octets |
|---|---|
| DynamoDB JSON tel qu'envoyé sur le réseau | 607 |
| Le même document en JSON ordinaire minifié | 447 |
| Taille d'élément facturée | 350 |
L'élément stocké est donc 22 % plus petit que le JSON dont tu es parti, et 42 % plus petit que la requête qui l'a transporté. Ce sont les nombres qui font l'essentiel du travail : 149.97 se stocke sur environ 4 octets contre 6 caractères de texte. Les chaînes et les noms sont comptés exactement ; AWS documente l'encodage des nombres à environ un octet pour deux chiffres significatifs, donc lis 350 comme exact à quelques octets près, pas à l'octet.
Ce qui te coûte, en revanche, ce sont les noms. Les noms d'attribut et les clés de map représentent 148 de ces 350 octets, 42 % de l'élément, et tu les paies sur chaque copie. Raccourcir shippingAddress en addr sur un milliard d'éléments est une vraie économie. Tu peux dimensionner n'importe quel document dans le calculateur de taille d'élément, que nous avons confronté à la frontière de facturation du moteur lui-même : les éléments qu'il place à 1 024 octets consomment une unité d'écriture, et 1 025 en consomment deux.
Ce que JSON perd à l'aller-retour
DynamoDB stocke les nombres comme des décimaux à 38 chiffres de précision : un nombre JSON est donc normalisé plutôt que préservé. Écrit puis relu directement :
{"price": 19.90} -> {"price": {"N": "19.9"}}
{"qty": 1.0} -> {"qty": {"N": "1"}}
{"limit": 1e5} -> {"limit": {"N": "100000"}}
{"id": 9007199254740993} -> {"id": {"N": "9007199254740993"}}C'est la dernière ligne qui est utile. DynamoDB garde l'entier exact, alors que JSON.parse('{"id":9007199254740993}') en Node te donne 9007199254740992. Si les identifiants comptent, stocke-les comme chaînes.
Deux documents JSON que DynamoDB refuse tout net : une clé vide ({"": "x"} lève ValidationException: Empty attribute name, et la même règle s'applique dans une map imbriquée), et un nombre au-delà de la limite de précision, qui lève ValidationException: DynamoDB only supports precision up to 38 digits.
La seule réserve
Les types de DynamoDB sont un sur-ensemble de ceux de JSON. Les attributs Binaires (B) et Ensembles (SS/NS/BS) n'ont pas d'équivalent JSON direct : les ensembles se sérialisent donc en tableaux et le binaire en base64 quand tu reconvertis vers du JSON ordinaire.
Travailler avec
Tu peux opérer directement sur des attributs JSON imbriqués — filtrer sur un champ de map, mettre à jour un élément de liste — sans réécrire l'élément entier.
Aller plus loin
Voir DynamoDB JSON et marshalling, et convertis entre JSON ordinaire et DynamoDB JSON avec le convertisseur JSON. Télécharge DynoTable pour modifier visuellement des éléments JSON.
Références
- 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
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.
Mesuré et reproduit le 2026-07-28. Les trois comptages d'octets viennent de notre propre calculateur de taille d'élément et de la requête sérialisée ; les allers-retours sur les nombres et les deux chaînes ValidationException sont la sortie brute de DynamoDB Local 3.3.0 via @aws-sdk/client-dynamodb 3.1095.0, dont la formulation des messages peut différer de celle du service en production.