• Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу