ArduinoJSON v6 – передача буфера как параметра функции
Я новичок в ArduinoJSON, так что, возможно, это вопрос для новичка.... но я хочу передать StaticJsonDocument
в функцию в качестве параметра (позже это должно быть реализовано в библиотека).
Пример ниже показывает test_1
, что я хочу получить, но дублируя StaticJsonDocument
, чего я не хочу делать.
Как можно написать test_1
(как я пробовал в test_2
)?
#include <ArduinoJson.h>
StaticJsonDocument<200> doc;
void createJSON() {
doc["sensor"] = "gps";
doc["time"] = 1351824120;
JsonArray data = doc.createNestedArray("data");
data.add(48.756080);
data.add(2.302038);
// Генерируем минифицированный JSON и отправляем его в последовательный порт.
serializeJson(doc, Serial);
Serial.println("JSON is created:");
// Генерируем предварительно подготовленный JSON и отправляем его в последовательный порт.
serializeJsonPretty(doc, Serial);
}
bool test_1(StaticJsonDocument<100> _doc){
serializeJson(_doc, Serial);
return true;
}
bool test2(const JsonObject& _doc){
Serial.println("HI");
serializeJson(_doc, Serial);
}
void setup() {
Serial.begin(9600);
createJSON();
test_1(doc);
}
void loop() {
// не используется в этом примере
}
@Guy . D, 👍3
Обсуждение1 ответ
Лучший ответ:
StaticJsonDocument
— это класс шаблона. Значение шаблона в <> здесь представляет собой только размер внутреннего буфера, но каждый используемый размер создает другой класс. (использование памяти!)
Чтобы параметр функции принимал экземпляр версии StaticJsonDocument
, он должен быть той же версии или общего базового класса. В данном случае базовым классом является JsonDocument
.
Если вы не используете ссылочный символ &
, параметр копируется. В этом случае StaticJsonDocument<200> _doc
или JsonDocument _doc
создаст копию, и эта копия будет изменена в функции. Объект, используемый в качестве значения параметра, останется неизменным — пустым.
Так что используйте
void test2(const JsonDocument& _doc) {
Serial.println("HI");
serializeJson(_doc, Serial);
}
Привет @Juraj, спасибо за этот ответ. Я пытаюсь сделать то же самое, что и @Guy .D, за исключением того, что при реализации вашего решения я получаю ошибку компилятора:
неизвестно преобразование аргумента 2 из ArduinoJson6101_000::StaticJsonDocument<168u>' в 'const JsonObject& {aka const ArduinoJson6101_000::ObjectRef&}
Любой совет был бы полезен, и я могу опубликовать фрагмент кода, если потребуется., @Peza
да, я использую ArduinoJSON V6., @Peza
извините, фрагмент кода был из кода Гая, а не из моего теста. исправленный, @Juraj
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Почему считается плохой практикой использовать ключевое слово "new" в Arduino?
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Получение всех данных моего объекта JSON из Serial.read() сразу
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Цикл foreach Arduino JSON
- Проанализировать большой ответ json с помощью ESP8266
bool test_1(StaticJsonDocument<DOC_SIZE>& _doc) {
используйте определение или константу для размера. это должно быть то же самое, @Juraj@Юрай, почему бы не опубликовать это как ответ? это работает нормально, @Guy . D
речь не об Ардуино, но ок. Я даже нашел лучшее решение. (Я знаю, что это работает, я проверил это), @Juraj