Introduction
ArduinoJson is a C++ JSON library designed for embedded systems. It provides a simple API for parsing and generating JSON with predictable memory usage, making it the standard choice for IoT firmware that communicates via JSON APIs.
What ArduinoJson Does
- Parses JSON strings into a queryable document model
- Serializes C++ data structures to JSON or MessagePack
- Uses a fixed-size or dynamic memory pool to avoid heap fragmentation
- Supports JSON filtering to parse only the fields you need
- Handles nested objects, arrays, and streaming input
Architecture Overview
ArduinoJson uses a JsonDocument that owns a contiguous memory pool. Parsing writes all values into this pool, avoiding scattered heap allocations. The library is header-only with no external dependencies, compiling on any C++11 toolchain from AVR to 64-bit desktop.
Self-Hosting & Configuration
- Install via the Arduino Library Manager or PlatformIO
- Include the single header and create a JsonDocument with a size estimate
- Use the ArduinoJson Assistant at arduinojson.org to calculate memory requirements
- Configure stack vs heap allocation by choosing StaticJsonDocument or DynamicJsonDocument
- Works on Arduino, ESP8266, ESP32, STM32, Teensy, and standard Linux/macOS/Windows
Key Features
- Header-only with zero external dependencies
- Predictable memory usage with no fragmentation
- Supports both JSON and MessagePack binary format
- JSON filtering reduces memory use by skipping unneeded fields
- Extensive test suite with over 3,000 unit tests
Comparison with Similar Tools
- cJSON — plain C and smaller but lacks type safety and streaming; ArduinoJson is more ergonomic in C++
- RapidJSON — faster on desktop but uses more memory; ArduinoJson is optimized for MCUs
- nlohmann/json — beautiful API for desktop C++; too large for most embedded targets
- Jansson — C library with good API but no MessagePack support
FAQ
Q: How much RAM does ArduinoJson need? A: It depends on the document. A typical IoT payload with 5-10 fields uses 200-500 bytes. The online assistant calculates exact requirements.
Q: Does it work on 8-bit AVR boards? A: Yes. ArduinoJson supports AVR, ARM, RISC-V, and Xtensa architectures with as little as 2KB RAM.
Q: Can I parse streaming JSON? A: Yes. ArduinoJson can read from Stream objects (Serial, WiFiClient, File) without loading the entire string into memory.
Q: Is ArduinoJson free for commercial use? A: Yes. It is released under the MIT license.