DynamicJsonDocument is a JsonDocument that allocates its memory pool in the heap.

Because it calls malloc() and free(), DynamicJsonDocument is slightly slower than StaticJsonDocument.

DynamicJsonDocument allows storing much larger documents than StaticJsonDocument because it is not limited by the size of the stack.

Custom allocator

DynamicJsonDocument uses a default memory allocator that calls malloc() and free(). You can use other functions by passing a custom allocator class to BasicJsonDocument<T>. As an example, here is how DynamicJsonDocument is defined:

struct DefaultAllocator {
  void* allocate(size_t n) {
    return malloc(n);

  void deallocate(void* p) {

typedef BasicJsonDocument<DefaultAllocator> DynamicJsonDocument;

See BasicJsonDocument<T> for more information.

Member functions


Here is a program that deserializes a JSON document using a DynamicJsonDocument:

DynamicJsonDocument doc(2048);

char json[] = "{\"hello\":\"world\"}";
deserializeJson(doc, json);

const char* world = doc["hello"];


In older versions, DynamicJsonDocument was able to grow if needed. Starting with version 6.7.0, DynamicJsonDocument has a fixed capacity, just like StaticJsonDocument. This change allows better performance, smaller code, and no heap fragmentation.

Arduino 6.6.0 contained a full-blown allocator (i.e., non-monotonic) and was able to compact the memory inside the JsonDocument. This feature was reverted in version 6.7.0 because the overhead was unacceptable.

See also