как перевести json в строку?

c++ iot json mqtt

Я получаю объект 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 не выполняется?

, 👍3

Обсуждение

что напечатано в последовательном мониторе?, @jsotola


1 ответ


Лучший ответ:

6

Это одна из особенностей языка 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