Понимание помощника по расчету емкости ArduinoJson
Я пытаюсь выяснить, как можно
рассчитать емкость ArduinoJson, поэтому я пришел к веб-приложению Assistant, разработанному разработчиком библиотеки https://arduinojson.org/v6/assistant/
Вот чего я не понимаю, так это почему, когда я использую любую из следующих двух строк JSON, помощник показывает мне ту же емкость? Я ожидал бы, что более длинные значения JSON приведут к большей емкости, но это, похоже, не так.
{
"wifi": {
"ssid": "S",
"password": "P",
"hostname": "H"
},
"administration": {
"username": "U",
"password": "P"
}
}
{
"wifi": {
"ssid": "SSSSSSSSSSSSSSSSSSSSSSSSSSS",
"password": "PPPPPPPPPPPPPPPPPPPPPPPPPP",
"hostname": "HHHHHHHHHHHHHHHHHHHHHHHHHHHH"
},
"administration": {
"username": "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUU",
"password": "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP"
}
}
Я пытаюсь рассчитать емкость с помощью помощника, используя следующую конфигурацию:
ESP8266 / Десериализация / char*
Кто-нибудь может мне это объяснить? Очевидно, я неправильно понимаю "причину" емкости?
2 ответа
Лучший ответ:
Если вы посмотрите на детали сообщаемых цифр, то увидите:
Data structures 112
Strings 0
Total (minimum) 112
Total (recommended) 128
Как видите, для строк выделено ровно ноль байтов. Это означает, что библиотека не копирует строки, а вместо этого ссылается на них из массива символов, который вы предоставляете в качестве входных данных.
Если вместо этого вы настроите библиотеку для потокового
ввода, ей придется
хранить строки, и тогда емкость этих двух
документов будет очень разной.
Вы помогли мне понять, как здесь все рассчитано, спасибо!. Тем не менее, я нашел реальную проблему, пожалуйста, проверьте мой ответ., @Mohammed Noureldin
Я нашел, в чем настоящая проблема. В инструменте assistant при выборе const char *
в качестве типа ввода он показывает, что размер строки равен 0, что неверно в соответствии с документацией библиотеки.
https://arduinojson.org/v6/api/json/deserializejson/
// записываемый ввод => нулевое копирование
DeserializationError deserializeJson(JsonDocument& doc, char* input);
// ввод только для чтения => дублирование
DeserializationError deserializeJson(JsonDocument& doc, const char* input);
Помощник, если я правильно вижу, не различает эти два случая и, таким образом, дает неправильную емкость для этого случая const.
Соответственно, в const char *
недостаточно только взять размер структуры, но и рассмотреть хранящиеся в ней данные.
Согласно документации, причина, по которой const char *
не может быть нулевой копией, заключается в следующем:
3.9.2 Требуется дублирование Как мы видели в предыдущем разделе, в режиме нулевого копирования ArduinoJson хранит указатели , указывающие внутри входного буфера. Мы видели, что он должен заменить некоторые символы ввода нулевыми терминаторами. С вводом только для чтения ArduinoJson больше не может этого делать, поэтому ему нужно делать копии "hip" и "hop". Как вы думаете, куда пойдут копии? В JsonDocument, конечно!
Обновить
После сообщения об этой ошибке (см. Ссылку ниже) она была быстро исправлена!
https://github.com/bblanchon/ArduinoJson/issues/1488
Хороший улов! Вы подумывали о том, чтобы отправить сообщение об ошибке?, @Edgar Bonet
@EdgarBonet Спасибо! Я уже сделал это https://github.com/bblanchon/ArduinoJson/issues/1488, @Mohammed Noureldin
Что ж, теперь они все исправили., @Mohammed Noureldin
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Проанализировать большой ответ json с помощью ESP8266
- Публиковать данные json в mqtt
- Какой максимальный размер статического документа Json в Arduino JSON?
- Чтение файла json из SPIFFS и отображение содержащейся в нем информации на встроенной веб-странице
- ESP8266 Arduino Json object array десериализация в структуру
Этот сайт сообщает мне разные возможности для двух документов JSON. Как именно вы установили конфигурацию?, @Edgar Bonet
@EdgarBonet, ну извините, я только что понял, что я должен был упомянуть, как я пытался рассчитать *емкость. ESP8266/Десериализация/char* *, @Mohammed Noureldin