ArduinoJSON v6 – передача буфера как параметра функции

pointer json

Я новичок в 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() {
        // не используется в этом примере
}

, 👍3

Обсуждение

bool test_1(StaticJsonDocument<DOC_SIZE>& _doc) { используйте определение или константу для размера. это должно быть то же самое, @Juraj

@Юрай, почему бы не опубликовать это как ответ? это работает нормально, @Guy . D

речь не об Ардуино, но ок. Я даже нашел лучшее решение. (Я знаю, что это работает, я проверил это), @Juraj


1 ответ


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

7

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