• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь JSON парсинг

Виктор_1966

New member
Доброго времени вопрос такого характера есть Json такого формата
{"module":["relay1","relay2","relay3","ntp","timers","temperature","humidity","pressure","admin","pulse","mqtt"],"SSDP":"Switch","space":"Room","ip":"192.168.0.51","lang":"ru"}
1 имя "module" содержит массив ...собственно что нужно
если в массиве есть relay1
то выполнить действие к примеру зажечь 1 й светодиод
если этого имени в массиве нет то не зажигать
порядок скорее всего может меняться я не проверял
дайте совет как распарсить без знания порядка
 

tretyakov_sa

Moderator
Команда форума
// Str строка которую проверяем Ключ который ищем key
boolean serchStr(String Str, String key) {
int p = Str.indexOf(key+"\"");
if (p != -1) {
return true;
} else return false;
}
В вашем случае вызов такой:
serchStr(modules, "relay1")
Что вы будите делать дальше зависит от вас функция вернет истину или лож.
 

Виктор_1966

New member
Большое человеческое спасибо вроде заработало ))буду ковырять дальше
кстати это из ваших исходников собираю прошивку для себя со многим разобрался но кое что ещё в планах
 

FatMan

New member
Не буду начинать новую тему. Вопрос у меня про то же: про JSON и парсинг.
Исторически использую ArduinoJson от bblanchon старой версии - 5.13.4.
А вопрос такой: как задать некоей переменной значение по умолчанию, если соответствующего ей параметра нет в json-строке?

Например, у меня в программе после парсинга есть такое:
C++:
#define cnt_DEFAULT 100
int16_t cnt = cnt_DEFAULT; // значение по умолчанию
// тут всякое, в том числе получение json_str
JsonObject& json = jsonBuffer.parseObject(json_str); // парсинг json
cnt = json["cnt"]; // проблемная строка
Если cnt установлен в json (хоть в 0), то всё хорошо. Но если такого параметра нет, то мне бы хотелось сохранить дефолтовое значение.
И таких параметров много.

Есть ли иные способы или (иные библиотеки), которые позволили бы мне, например, сделать что-то типа такого:
C++:
#define cnt_DEFAULT 100
cnt = json_smart("cntr",cnt_DEFAULT);
?
Или придётся самому для каждого параметра сначала проверять json_str.indexOf("\"cnt\""), а потом брать значение дефолтное или из json?
 

enjoynering

Well-known member
лучше перейти на новубю 6-ю версию. она не так жрет пямять. переход довольно простой. у меня заняло вечер, чтоб разобраться. использовал статьи про переход с 5 на 6 с официального вебсайта.

там же есть про дефолтовое значение если пааметр отсутствует
 

yurik72

Member
Я использую простую темплейтную функцию
template<typename T>
void loadif(T& var, JsonObject& json,const char * key) {
if (json.containsKey(key)) {
var = json[key].as<T>();
}
}
В твоем случае будет
cnt=cnt_DEFAULT ;
loadif(cnt, json, "cnt");

Можешь ее расширить до дефолтных параметров. Я просто заранее инициализирую переменные, и потом они есть в json, перегружаю
 

enjoynering

Well-known member
Зачем изобретать велосипед (темплейтную функцию) все есть в arduinojson v6
 
Сверху Снизу