Понимание помощника по расчету емкости ArduinoJson

esp8266 json

Я пытаюсь выяснить, как можно рассчитать емкость 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*

Кто-нибудь может мне это объяснить? Очевидно, я неправильно понимаю "причину" емкости?

, 👍3

Обсуждение

Этот сайт сообщает мне разные возможности для двух документов JSON. Как именно вы установили конфигурацию?, @Edgar Bonet

@EdgarBonet, ну извините, я только что понял, что я должен был упомянуть, как я пытался рассчитать *емкость. ESP8266/Десериализация/char* *, @Mohammed Noureldin


2 ответа


Лучший ответ:

4

Если вы посмотрите на детали сообщаемых цифр, то увидите:

Data structures     112
Strings             0
Total (minimum)     112
Total (recommended) 128

Как видите, для строк выделено ровно ноль байтов. Это означает, что библиотека не копирует строки, а вместо этого ссылается на них из массива символов, который вы предоставляете в качестве входных данных.

Если вместо этого вы настроите библиотеку для потокового ввода, ей придется хранить строки, и тогда емкость этих двух документов будет очень разной.

,

Вы помогли мне понять, как здесь все рассчитано, спасибо!. Тем не менее, я нашел реальную проблему, пожалуйста, проверьте мой ответ., @Mohammed Noureldin


2

Я нашел, в чем настоящая проблема. В инструменте 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