8 #include <esp_heap_caps.h> 17 static const char *
const TAG =
"json";
19 static std::vector<char> global_json_build_buffer;
27 const size_t free_heap = ESP.getMaxFreeBlockSize();
28 #elif defined(USE_ESP32) 29 const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
30 #elif defined(USE_RP2040) 31 const size_t free_heap = rp2040.getFreeHeap();
32 #elif defined(USE_LIBRETINY) 33 const size_t free_heap = lt_heap_get_free();
36 size_t request_size = std::min(free_heap, (
size_t) 512);
38 ESP_LOGV(TAG,
"Attempting to allocate %u bytes for JSON serialization", request_size);
39 DynamicJsonDocument json_document(request_size);
40 if (json_document.capacity() == 0) {
42 "Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes",
43 request_size, free_heap);
46 JsonObject root = json_document.to<JsonObject>();
48 if (json_document.overflowed()) {
49 if (request_size == free_heap) {
50 ESP_LOGE(TAG,
"Could not allocate memory for JSON document! Overflowed largest free heap block: %u bytes",
54 request_size = std::min(request_size * 2, free_heap);
57 json_document.shrinkToFit();
58 ESP_LOGV(TAG,
"Size after shrink %u bytes", json_document.capacity());
60 serializeJson(json_document, output);
71 const size_t free_heap = ESP.getMaxFreeBlockSize();
72 #elif defined(USE_ESP32) 73 const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
74 #elif defined(USE_RP2040) 75 const size_t free_heap = rp2040.getFreeHeap();
76 #elif defined(USE_LIBRETINY) 77 const size_t free_heap = lt_heap_get_free();
80 size_t request_size = std::min(free_heap, (
size_t) (data.size() * 1.5));
82 DynamicJsonDocument json_document(request_size);
83 if (json_document.capacity() == 0) {
84 ESP_LOGE(TAG,
"Could not allocate memory for JSON document! Requested %u bytes, free heap: %u", request_size,
88 DeserializationError err = deserializeJson(json_document, data);
89 json_document.shrinkToFit();
91 JsonObject root = json_document.as<JsonObject>();
93 if (err == DeserializationError::Ok) {
96 }
else if (err == DeserializationError::NoMemory) {
97 if (request_size * 2 >= free_heap) {
98 ESP_LOGE(TAG,
"Can not allocate more memory for deserialization. Consider making source string smaller");
101 ESP_LOGV(TAG,
"Increasing memory allocation.");
105 ESP_LOGE(TAG,
"JSON parse error: %s", err.c_str());
void parse_json(const std::string &data, const json_parse_t &f)
Parse a JSON string and run the provided json parse function if it's valid.
std::function< void(JsonObject)> json_build_t
Callback function typedef for building JsonObjects.
std::string build_json(const json_build_t &f)
Build a JSON string with the provided json build function.
Implementation of SPI Controller mode.
std::function< void(JsonObject)> json_parse_t
Callback function typedef for parsing JsonObjects.