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
- Проблемы с преобразованием uint32_t в char*
- Цикл foreach Arduino JSON
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
bool test_1(StaticJsonDocument<DOC_SIZE>& _doc) {используйте определение или константу для размера. это должно быть то же самое, @Juraj@Юрай, почему бы не опубликовать это как ответ? это работает нормально, @Guy . D
речь не об Ардуино, но ок. Я даже нашел лучшее решение. (Я знаю, что это работает, я проверил это), @Juraj