Description
Board
Board: ESP32-S3
Device Description
Description:
After updating to Arduino-ESP32 3.1.2, we observed frequent crashes when using serializeJson with DynamicJsonDocument. The issue occurs specifically when handling empty or minimal JSON objects like {} or when the serialized String is empty (""). This behavior was not present in previous versions and might be related to recent changes in String behavior (String::move fix). The crash generates a Guru Meditation Error (LoadProhibited).
Example Code:
DynamicJsonDocument doc(2048);
doc["data"] = "{}";
String json;
serializeJson(doc, json); // Causes crash
We also experience similar crashes when serializing responses with minimal data (doc["data"] = {} or []), which should be valid JSON structures.
By switching to std::string for handling serialization, the crash is avoided. The modified code is shown below:
#include // Use std::string
DynamicJsonDocument doc(2048);
doc["data"] = "{}";
std::string jsonString;
serializeJson(doc, jsonString); // No crash
This might suggest an underlying issue with String conversion in the recent core update.
Environment:
Board: ESP32-S3
Core Version: Arduino-ESP32 3.1.2
ArduinoJson Version: 7.3.0
The issue seems closely related to serializeJson combined with String. Let me know if you need additional debug logs or a full backtrace.
Hardware Configuration
no
Version
v3.1.2
IDE Name
Arduino 2.3.4
Operating System
11
Flash frequency
40m
PSRAM enabled
no
Upload speed
115200
Description
no
Sketch
//////////////////////////////////////////////////////////////////////////////////////////////voidprocessRawInput(String rawData, String source) { Serial.println("Raw data to be parsed: " + rawData); // Parse JSON from the raw data DynamicJsonDocument doc(2048); // Adjusted for larger data DeserializationError error = deserializeJson(doc, rawData); if (error) { Serial.println("Invalid JSON received from source: " + source); return; } // Extract command details CommandData cmdData; cmdData.source = source; cmdData.sequenceId = doc["sequenceId"] | String(time(NULL)); if (doc.containsKey("data")) { // Serialize the "data" object into a string and store it in cmdData.data//String jsonString; std::string jsonString; serializeJson(doc["data"], jsonString); // cmdData.data = jsonString; cmdData.data = String(jsonString.c_str()); // Convert safely back to String } else { Serial.println("Error: 'data' key is missing or invalid."); return; } String commandName = doc["command"] | ""; if (commandName.isEmpty()) { Serial.println("Error: 'command' key is missing or invalid."); return; } // Process the commandprocessCommand(commandName, cmdData); } ### Debug Message ```plain Decoding stack results 0x420405c0: is in String::operator=(charconst*) (C:\Users\Admin\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.1.2\cores\esp32\WString.cpp:293). 0x42016ddf: is in ArduinoJson::V730PB22::detail::serialize<ArduinoJson::V730PB22::detail::JsonSerializer, String>(ArduinoJson::V730PB22::JsonVariantConst, String&) (c:\Users\Admin\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp:19). 0x42016e69: is in ArduinoJson::V730PB22::serializeJson<String, 0>(ArduinoJson::V730PB22::JsonVariantConst, String&) (c:\Users\Admin\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Json/JsonSerializer.hpp:137).
Other Steps to Reproduce
No response
I have checked existing issues, online documentation and the Troubleshooting Guide
- I confirm I have checked existing issues, online documentation and Troubleshooting guide.