kandi background

ArduinoJson | JSON library for Arduino and embedded C

Download this library from

kandi X-RAY | ArduinoJson Summary

ArduinoJson is a C++ library typically used in Internet of Things (IoT), Arduino applications. ArduinoJson has no bugs, it has no vulnerabilities, it has a Permissive License and it has medium support. You can download it from GitHub.
ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).

kandi-support Support

  • ArduinoJson has a medium active ecosystem.
  • It has 5624 star(s) with 1006 fork(s). There are 198 watchers for this library.
  • There were 5 major release(s) in the last 6 months.
  • There are 20 open issues and 1648 have been closed. On average issues are closed in 5 days. There are no pull requests.
  • It has a neutral sentiment in the developer community.
  • The latest version of ArduinoJson is v6.19.4

quality kandi Quality

  • ArduinoJson has 0 bugs and 0 code smells.


  • ArduinoJson has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
  • ArduinoJson code analysis shows 0 unresolved vulnerabilities.
  • There are 0 security hotspots that need review.

license License

  • ArduinoJson is licensed under the MIT License. This license is Permissive.
  • Permissive licenses have the least restrictions, and you can use them in most projects.


  • ArduinoJson releases are available to install and integrate.
  • Installation instructions are not available. Examples and code snippets are available.
Top functions reviewed by kandi - BETA

Coming Soon for all Libraries!

Currently covering the most popular Java, JavaScript and Python libraries. See a SAMPLE HERE.
kandi's functional review helps you automatically verify the functionalities of the libraries and avoid rework.

ArduinoJson Key Features

JSON deserialization Optionally decodes UTF-16 escape sequences to UTF-8 Optionally stores links to the input buffer (zero-copy) Optionally supports comments in the input Optionally filters the input to keep only desired values Supports single quotes as a string delimiter Compatible with NDJSON and JSON Lines

JSON serialization Can write to a buffer or a stream Optionally indents the document (prettified JSON)

MessagePack serialization

MessagePack deserialization

Efficient Twice smaller than the "official" Arduino_JSON library Almost 10% faster than the "official" Arduino_JSON library Consumes roughly 10% less RAM than the "official" Arduino_JSON library Fixed memory allocation, no heap fragmentation Optionally works without heap memory (zero malloc) Deduplicates strings

Versatile Supports custom allocators (to use external RAM chip, for example) Supports String, std::string, and std::string_view Supports Stream and std::istream/std::ostream Supports Flash strings Supports custom readers and custom writers Supports custom converters

Portable Usable on any C++ project (not limited to Arduino) Compatible with C++98, C++11, C++14 and C++17 Zero warnings with -Wall -Wextra -pedantic and /W4 Header-only library Works with virtually any board Arduino boards: Uno, Due, Micro, Nano, Mega, Yun, Leonardo... Espressif chips: ESP8266, ESP32 Lolin (WeMos) boards: D1 mini, D1 Mini Pro... Teensy boards: 4.0, 3.2, 2.0 Particle boards: Argon, Boron, Electron, Photon... Texas Instruments boards: MSP430... Soft cores: Nios II... Tested on all major development environments Arduino IDE Atmel Studio Atollic TrueSTUDIO Energia IAR Embedded Workbench Keil uVision MPLAB X IDE Particle PlatformIO Sloeber plugin for Eclipse Visual Micro Visual Studio Even works with online compilers like wandbox.org CMake friendly

Well designed Elegant API Thread-safe Self-contained (no external dependency) const friendly for friendly TMP friendly Handles integer overflows

Well tested Unit test coverage close to 100% Continuously tested on Visual Studio 2010, 2012, 2013, 2015, 2017, 2019, 2022 GCC 4.4, 4.6, 4.7, 4.8, 4.9, 5, 6, 7, 8, 9, 10, 11 Clang 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 6.0, 7, 8, 9, 10 Continuously fuzzed with Google OSS Fuzz Passes all default checks of clang-tidy

Well documented Tutorials Examples How-tos FAQ Troubleshooter Book Changelog

Vibrant user community Most popular of all Arduino libraries on GitHub Used in hundreds of projects Responsive support Discord server

ArduinoJson Examples and Code Snippets

  • Deserialization
  • Serialization
  • Thinger.IO client setup for GPRS enabled ESP32 project
  • Getting json keys from an array from an object using ArduinoJson
  • ESP32 Arduino httpSecureClient -1 error at core 0 without reason why
  • ESP8266WiFi.h: No such file or directory
  • Arduino HTTP.post() returns -11
  • How to copy all members of a json object to a 2d array given that the object name matches (ArduinoJson)
  • Getting [e][wifigeneric.cpp:739] hostbyname(): dns failed when performing POST request
  • Issue with WiFiNINA to get JSON data
  • How do I get Visual Studio Code to include non-standard libraries with angle brackets <>?
  • Failing to connect an ESP8266 to a Flask Server


char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";

DynamicJsonDocument doc(1024);
deserializeJson(doc, json);

const char* sensor = doc["sensor"];
long time          = doc["time"];
double latitude    = doc["data"][0];
double longitude   = doc["data"][1];

Community Discussions

Trending Discussions on ArduinoJson
  • Thinger.IO client setup for GPRS enabled ESP32 project
  • Getting json keys from an array from an object using ArduinoJson
  • ESP32 Arduino httpSecureClient -1 error at core 0 without reason why
  • ESP8266WiFi.h: No such file or directory
  • ESP32 Firebase: authenticating results in error code 400 - but Firebase does recognize my login
  • Arduino HTTP.post() returns -11
  • How to copy all members of a json object to a 2d array given that the object name matches (ArduinoJson)
  • Getting [e][wifigeneric.cpp:739] hostbyname(): dns failed when performing POST request
  • Issue with WiFiNINA to get JSON data
  • How do I get Visual Studio Code to include non-standard libraries with angle brackets <>?
Trending Discussions on ArduinoJson


Thinger.IO client setup for GPRS enabled ESP32 project

Asked 2022-Apr-02 at 21:33

I've been using the Thinger.io platform for some of my IoT projects (mostly ESP8266 modules) for quite a long time now. The way I implemented it is something similar to that:

#include <ThingerESP8266.h>
#include <ESP8266WIFI.h>

#define USERNAME "username"
#define DEVICE_ID "deviceid"
#define DEVICE_CREDENTIAL "devicecredential"


void connectToWifi() {

void setup() {

void loop() {

and it just works. It is good to also mention that I've been using WiFi all the way.

Now I am trying to achieve the same by taking advantage of a controller called TTGO T-Call ESP32. It is GPRS enabled (using the TinyGsmClient.h) and I have inserted a SIM card inside of it which successfully connects to the internet. The issue is that I can not really establish a connection to the Thinger.io platform where my devices are hosted. This is what my code looks like (making a reference to this library example)

    // Your GPRS credentials (leave empty, if not needed)
const char apn[]      = ""; // APN (example: internet.vodafone.pt) use https://wiki.apnchanger.org
const char gprsUser[] = ""; // GPRS User
const char gprsPass[] = ""; // GPRS Password

// SIM card PIN (leave empty, if not defined)
const char simPIN[]   = ""; 

// TTGO T-Call pins
#define MODEM_RST            5
#define MODEM_PWKEY          4
#define MODEM_POWER_ON       23
#define MODEM_TX             27
#define MODEM_RX             26
#define I2C_SDA              21
#define I2C_SCL              22

// Set serial for debug console (to Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to SIM800 module)
#define SerialAT Serial1

// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800      // Modem is SIM800
#define TINY_GSM_RX_BUFFER   1024  // Set RX buffer to 1Kb

// Define the serial console for debug prints, if needed

#include <Wire.h>
#include <TinyGsmClient.h>

  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, SerialMon);
  TinyGsm modem(debugger);
  TinyGsm modem(SerialAT);

// I2C for SIM800 (to keep it running when powered from battery)
TwoWire I2CPower = TwoWire(0);

// TinyGSM Client for Internet connection
TinyGsmClient client(modem);

#define uS_TO_S_FACTOR 1000000UL   /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  3600        /* Time ESP32 will go to sleep (in seconds) 3600 seconds = 1 hour */

#define IP5306_ADDR          0x75
#define IP5306_REG_SYS_CTL0  0x00

bool setPowerBoostKeepOn(int en){
  if (en) {
    I2CPower.write(0x37); // Set bit1: 1 enable 0 disable boost keep on
  } else {
    I2CPower.write(0x35); // 0x37 is default reg value
  return I2CPower.endTransmission() == 0;

void connectToApn(){
  SerialMon.println("Connecting to: internet.vivacom.bg ... ");

  while(!modem.gprsConnect(apn, gprsUser, gprsPass))
  SerialMon.println("Successfully connected to: internet.vivacom.bg");

// #include <ThingerCore32.h> => ArduinoJson.h: No such file or directory
// #include <ThingerESP8266.h> => ESP8266WiFi.h : No such file or directory
#define USERNAME ""
#define DEVICE_ID ""

#include <ThingerESP32.h>
//#include "arduino_secrets.h"

// Server details
const char server[]   = "vsh.pp.ua";
const char resource[] = "/TinyGSM/logo.txt";
const int  port       = 80;

#include <ArduinoHttpClient.h>
HttpClient http(client, server, port);

void setup() {
  // Set serial monitor debugging window baud rate to 115200

  // Start I2C communication
  I2CPower.begin(I2C_SDA, I2C_SCL, 400000);

  // Keep power when running from battery
  bool isOk = setPowerBoostKeepOn(1);
  SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL"));

  // Set modem reset, enable, power pins
  digitalWrite(MODEM_PWKEY, LOW);
  digitalWrite(MODEM_RST, HIGH);
  digitalWrite(MODEM_POWER_ON, HIGH);

  // Set GSM module baud rate and UART pins
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);

  // Restart SIM800 module, it takes quite some time
  // To skip it, call init() instead of restart()
  SerialMon.println("Initializing modem...");

  // Unlock your SIM card with a PIN if needed
  if (strlen(simPIN) && modem.getSimStatus() != 3 ) {

  // Configure the wake up source as timer wake up  
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

  // Connect to APN

void loop() { 
  SerialMon.println("In the loop ...");

  SerialMon.print(F("Performing HTTP GET request... "));
  int err = http.get(resource);
  if (err != 0) {
    SerialMon.println(F("failed to connect"));

  int status = http.responseStatusCode();
  SerialMon.print(F("Response status code: "));
  if (!status) {

  SerialMon.println(F("Response Headers:"));
  while (http.headerAvailable()) {
    String headerName  = http.readHeaderName();
    String headerValue = http.readHeaderValue();
    SerialMon.println("    " + headerName + " : " + headerValue);

  int length = http.contentLength();
  if (length >= 0) {
    SerialMon.print(F("Content length is: "));
  if (http.isResponseChunked()) {
    SerialMon.println(F("The response is chunked"));

  String body = http.responseBody();

  SerialMon.print(F("Body length is: "));
  // Put ESP32 into deep sleep mode (with timer wake up)
  // esp_deep_sleep_start();

NOTE: The board I've picked from the Arduino IDE is called ESP32 Wrover Module


Answered 2022-Mar-27 at 14:01

It would be better if you ask this question on the thinger community, the thinger.io https://community.thinger.io/ where the thinger devs or community will be listening.

I have some working code, see below, this works with SIM7000E, but it should work OK with SIM800 the code should work the same. I have noticed that you are not using the thinger library (ThingerTinyGSM.h) and this is probably why the device isn't connecting to thinger.

#define THINGER_SERIAL_DEBUG //This will provide debug messages of what thinger 
code is trying to do
#define _DISABLE_TLS_ //TLS needs to be disabled if using ESP32 (not sure why, this is a known bug)

// Select your modem:
//#define TINY_GSM_MODEM_SIM800 //Note SimCom docs state that SIM7000e used same commands as SIM800
#define TINY_GSM_MODEM_SIM7000 //Note SimCom docs state that SIM7000e used same commands as SIM800

#define APN_NAME "..."
#define APN_USER "..."
#define APN_PSWD "..."

//Pins for connecting to SIM module using 2nd Serial connection
#define RXD1 16 
#define TXD1 17

#include <TinyGsmClient.h>
#include <ThingerTinyGSM.h>

//Thinger credentials
#define USERNAME "...."    //Thinger Account User Name
#define DEVICE_ID "...."    //Thinger device IC
#define DEVICE_CREDENTIAL "...." //Thinger device credential (password)

****  SET-UP  ****  SET-UP  ****
void setup() {
  // open serial for debugging
  Serial2.begin(115200, SERIAL_8N1, RXD1, TXD1);
  Serial.println(); Serial.println();
  Serial.println("Starting Thinger GSM Test");

  // set APN, you can remove user and password from call if your apn does not require them

  ////// Thinger resource output example (i.e. reading a sensor value)
  thing["Status"] >> [](pson & out) {
    out["Timer(ms)"] = millis();
    out["device"] = String(DEVICE_ID); 

void loop() { 

Source https://stackoverflow.com/questions/71542363

Community Discussions, Code Snippets contain sources that include Stack Exchange Network


No vulnerabilities reported

Install ArduinoJson

You can download it from GitHub.


For any new features, suggestions and bugs create an issue on GitHub. If you have any questions check and ask questions on community page Stack Overflow .

Explore Related Topics

Build your Application

Share this kandi XRay Report