Нужна помощь по типам данных

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброе время суток!

Понимаю, что вопрос ламерский, но запутался окончательно.

Задача простая, прочитать txt файл с SD-карты и скормить его парсеру JSON

JsonObject& parseObject(char* json, uint8_t nestingLimit=10); // <- recommended
JsonObject& parseObject(const char* json, uint8_t nestingLimit=10);
JsonObject& parseObject(const String& json, uint8_t nestingLimit=10);

Рекомендуется на вход парсера подавать char*

Читаю файл следующим кодом

 String JsonString;
  if (SD.exists(filename)) {
    myFile = SD.open(filename);
    if (myFile) {
      while (myFile.available()) {
        char buff = myFile.read();
        JsonString += buff;
      }
      myFile.close();
      result = true;
    }
  }
  char buf [JsonString.length()];
  JsonString.toCharArray(buf, JsonString.length());

  Serial.println(buf);
  root = jsonBuffer.parseObject(buf);

Serial.println(buf) - отрабатывает корректно,

а вот jsonBuffer.parseObject(buf); - не принимает.

Помогите пожалуйста, если возможно с объяснениями.

gonzales
Offline
Зарегистрирован: 13.07.2015

Да, забыл написать, вот как выглядит пример парсера JSON

 char json[] =
      "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";


  JsonObject& root = jsonBuffer.parseObject(json);

В чем отличие от моего примера, я не понимаю

 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Не принимает в каком смысле? Не компилируется?
 

На первый взгляд можно увидеть, что в примере массив имеет фиксированный размер, определяемый на этапе компиляции, а у вас он динамический (размер массива заранее не известен).

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

С какой целью добавлен промежуточный буфер в строках 13-14? Можно сделать проще, без него, например:

root = jsonBuffer.parseObject(JsonString.c_str());

Хотя, если честно, странно, можно и еще проще:

root = jsonBuffer.parseObject(JsonString);

 

Почему рекомендован именно первый способ - не совсем понятно.
Сам я не юзаю json, потому внутрь не лазил и не смотрел. Думаю, что там ничего особенного и данная рекомендация относилась к чему то другому (в другом контексте), потому что разницы между вызовом с JsonString.c_str() и JsonString практически никакой.
 
Для информации (взял из исходников), функция c_str описана так:
const char* c_str() const { return buffer; }
Такой вариант данных подходит под второй вариант вызова parseObject, т.е. под этот:
JsonObject& parseObject(const char* json, uint8_t nestingLimit=10);

 

gonzales
Offline
Зарегистрирован: 13.07.2015

kisoft, Спасибо за ответ!

root = jsonBuffer.parseObject(JsonString); - изначально так и было, тоже не понял, почему не компилится.

Нашел причину такого поведения.

У меня функция bool ReadJSONfromFile (File myFile, JsonObject& root)

я передаю в параметре root, как объект JSON

В таком виде root = jsonBuffer.parseObject(JsonString) не компилится.

JsonObject& root1 = jsonBuffer.parseObject(JsonString); - а вот так все работает

Странно это)))) Или нет?

 

 

gonzales
Offline
Зарегистрирован: 13.07.2015

Все, догнал!

parseObject - это метод конструктора, соответственно его нельзя вызвать для объекта, который уже как бы должен быть сконструирован. 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

gonzales пишет:

kisoft, Спасибо за ответ!

root = jsonBuffer.parseObject(JsonString); - изначально так и было, тоже не понял, почему не компилится.

Почему не компилится - говорится в нижнем окне, когда включены подробные сообщения компилятора. Если туда посмотреть часто причину видно. Разумеется иногда бывает и так, что сообщение подробное, но почему не компилится - фиг догадаешься.

А вообще, если сразу к вопросу прилагать сообщения об ошибках, нам и ответ будет найти проще. Хотя лучше сначала понять что за сообщение и к какой части строки оно относится ;) Плюс иногда помогает (если уж совсем непонятно) скопировать строку с ошибкой и погуглить её, часто находится ответ на вопрос. Хотя тоже не всегда. Но всё таки есть варианты, нежели ждать, когда кто нибудь найдет ;)