Use heap memory for large JsonDocuments

This commit is contained in:
fvanroie 2023-01-17 16:45:26 +01:00
parent d6c5f64143
commit 116877099b
2 changed files with 23 additions and 21 deletions

View File

@ -90,9 +90,9 @@ void my_msgbox_map_clear(lv_obj_t* obj)
const char** my_map_create(const char* payload)
{
// Reserve memory for JsonDocument
// size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256;
// DynamicJsonDocument map_doc(maxsize);
StaticJsonDocument<1024> map_doc;
// StaticJsonDocument<1024> map_doc;
size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256;
DynamicJsonDocument map_doc(maxsize);
DeserializationError jsonError = deserializeJson(map_doc, payload);
if(jsonError) { // Couldn't parse incoming JSON payload
@ -192,9 +192,9 @@ static bool my_line_set_points(lv_obj_t* obj, const char* payload)
// Create new points
// Reserve memory for JsonDocument
// size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256;
// DynamicJsonDocument doc(maxsize);
StaticJsonDocument<1024> doc;
// StaticJsonDocument<1024> doc;
size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256;
DynamicJsonDocument doc(maxsize);
DeserializationError jsonError = deserializeJson(doc, payload);
if(jsonError) { // Couldn't parse incoming JSON payload
@ -1656,15 +1656,15 @@ static hasp_attribute_type_t attribute_common_json(lv_obj_t* obj, uint16_t attr_
if(update) {
// size_t maxsize = (512u + JSON_OBJECT_SIZE(25));
// DynamicJsonDocument json(maxsize);
StaticJsonDocument<1024> json;
// StaticJsonDocument<1024> json;
size_t maxsize = (512u + JSON_OBJECT_SIZE(25));
DynamicJsonDocument json(maxsize);
// Note: Deserialization can to be (char *) so the objects WILL NOT be copied
// this uses less memory since the data is already copied from the mqtt receive buffer and cannot
// get overwritten by the send buffer !!
DeserializationError jsonError = deserializeJson(json, (char*)payload);
// json.shrinkToFit();
json.shrinkToFit();
if(jsonError == DeserializationError::Ok) {
// Make sure we have a valid JsonObject to start from

View File

@ -1,4 +1,4 @@
/* MIT License - Copyright (c) 2019-2022 Francis Van Roie
/* MIT License - Copyright (c) 2019-2023 Francis Van Roie
For full license information read the LICENSE file in the project folder */
#include <time.h>
@ -624,14 +624,14 @@ void dispatch_text_line(const char* payload, uint8_t source)
{
{
// size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 512;
// DynamicJsonDocument json(maxsize);
StaticJsonDocument<1024> doc;
// StaticJsonDocument<1024> doc;
size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 512;
DynamicJsonDocument doc(maxsize);
// Note: Deserialization needs to be (const char *) so the objects WILL be copied
// this uses more memory but otherwise the mqtt receive buffer can get overwritten by the send buffer !!
DeserializationError jsonError = deserializeJson(doc, payload);
// json.shrinkToFit();
doc.shrinkToFit();
if(jsonError) {
// dispatch_json_error(TAG_MSGR, jsonError);
@ -654,8 +654,11 @@ void dispatch_text_line(const char* payload, uint8_t source)
void dispatch_parse_json(const char*, const char* payload, uint8_t source)
{ // Parse an incoming JSON array into individual commands
StaticJsonDocument<2048> doc;
// StaticJsonDocument<2048> doc;
size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 512;
DynamicJsonDocument doc(maxsize);
DeserializationError jsonError = deserializeJson(doc, payload);
doc.shrinkToFit();
if(jsonError) {
dispatch_json_error(TAG_MSGR, jsonError);
@ -675,22 +678,21 @@ void dispatch_parse_jsonl(Stream& stream, uint8_t& saved_page_id)
void dispatch_parse_jsonl(std::istream& stream, uint8_t& saved_page_id)
#endif
{
// uint8_t savedPage = haspPages.get();
uint16_t line = 1;
StaticJsonDocument<1024> jsonl;
// StaticJsonDocument<1024> jsonl;
DynamicJsonDocument jsonl(MQTT_MAX_PACKET_SIZE / 2 + 128);
DeserializationError jsonError = deserializeJson(jsonl, stream);
jsonl.shrinkToFit();
#ifdef ARDUINO
stream.setTimeout(25);
#endif
// guiStop();
uint16_t line = 1;
while(jsonError == DeserializationError::Ok) {
hasp_new_object(jsonl.as<JsonObject>(), saved_page_id);
jsonError = deserializeJson(jsonl, stream);
line++;
}
// guiStart();
/* For debugging purposes */
if(jsonError == DeserializationError::EmptyInput) {