Глобальный JsonObject (ArduinoJson)

Я знаю, что нельзя использовать глобальный объект JsonObject, но у меня есть свои причины.

У меня есть функции JsonObject*, и я хочу, чтобы он сохранял содержимое файла. С

functions=new JsonObject(jsonBuffer.as<JsonObject>());

Я могу получить доступ к JsonObject, но не при выходе из метода. Может ли кто-нибудь помочь мне понять, почему? (Не давайте мне решение типа: скопировать в структуру, мне нужен JsonObject, готовый для чтения во всем моем коде.

Полный код:

JsonObject* functions;

void loadFunctions() {
  File file = SPIFFS.open("/functions.json", "r");
  if (!file) {
    Serial.println("Failed to open the file");
  }else{
    size_t size = file.size();
    if (size > 512) {
      Serial.println("File size is too large");
    }else{
      std::unique_ptr<char[]> buf(new char[size]);
      file.readBytes(buf.get(), size);
      DynamicJsonDocument jsonBuffer(256);
      DeserializationError error = deserializeJson(jsonBuffer, buf.get());
      if (error) {
        Serial.println("Failed to parse file ");
      } else {
        functions=new JsonObject(jsonBuffer.as<JsonObject>());
        Serial.println((*functions)["test"].as<String>()); // это не работает в другом методе
      }
    }
  }
}

, 👍0

Обсуждение

Вы где-нибудь вызывали loadFunctions?, @ratchet freak

Да и последний Serial.println работает, но не если я использую его в другом методе (после этого метода), @Maray97


1 ответ


1

jsonBuffer является локальным для функции. Когда вы выходите из функции, содержимое jsonBuffer теряется.

functions просто указывает на внутренности jsonBuffer, чтобы получить его данные (для экономии памяти).

Вы можете:

  • Сделайте jsonBuffer глобальным, чтобы он оставался постоянным, или
  • Имейте дополнительный глобальный DynamicJsonDocument или StaticJsonDocument, в который вы копируете свои объекты после чтения из jsonBuffer.
,

Спасибо, решил, выбрав второй вариант., @Maray97