как перевести json в строку?
Я получаю объект json от aws iot MQTT. Предполагая, что json из aws имеет {status:open}. Вот мой код.
#include <ArduinoJson.h>
void messageHandler(char *topic, byte *payload, unsigned int length)
{
StaticJsonDocument<32> doc;
deserializeJson(doc, payload);
const char *status = doc["status"];
Serial.println(status);//открыто
if (status == "opened")
{
Serial.println("door is opened");//не выполнять
}
else if (status == "closed")
{
Serial.println("door is closed");
}
}
Почему условие if не выполняется?
@Jess, 👍3
Обсуждение1 ответ
Лучший ответ:
Это одна из особенностей языка C: оператор ==
сравнивает адреса строк, а не их содержимое. Это имеет смысл, когда вы думаете о них как об указателях, но это может сбить с толку новичков.
Чтобы исправить это, вы можете использовать strcmp()
следующим образом:
if (strcmp(status,"открыто") == 0)
Кроме того, вы можете изменить тип status
на JsonVariant
, например:
JsonVariant status = doc["статус"]
Это работает с JsonVariant
, потому что я перегрузил оператор ==
для поддержки сравнения строк.
if (strcmp(status,"opened") == 0)
Вы, вероятно, знали это и просто забыли, но для пользы всех остальных, strcmp
возвращает 0
для равенства, и некоторые отрицательные и положительные числа для другие относительные порядки. Итак, вам понадобится == 0
. Проголосовать., @timemage
Спасибо, я обновил ответ., @Benoit Blanchon
_Отказ от ответственности: я ценю вашу работу над этой библиотекой. Это и ваш ответ хороши и полезны._ -- Однако такая перегрузка операторов является одной из многих причин, по которым я все еще не люблю C++ после 40 с лишним лет разработки программного обеспечения на многих языках. Он скрывает много вещей заранее и (неправильно) приводит к странным конструкциям, из-за чего неспециалистам трудно понять хорошее программирование. Таким образом, C++ не является адекватным языком программирования для начинающих., @the busybee
- Преобразование byte* в int в Arduino
- Публиковать данные json в mqtt
- Подключение ESP32 через MQTT
- Как связать MPU9250 и NodeMcu?
- Несколько тем MQTT
- ESP8266 SPIFFS не сохраняется правильно?
- Обратный вызов подписки MQTT не может быть вызван в режиме глубокого сна ESP8266
- Не могу скомпилировать .ino с помощью библиотеки ArduinoJson
что напечатано в последовательном мониторе?, @jsotola