I am getting a json object from aws iot MQTT. Assuming that json from aws is {status:opened}. Here is my code.
#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);//opened
if (status == "opened")
{
Serial.println("door is opened");//not excute
}
else if (status == "closed")
{
Serial.println("door is closed");
}
}
Why the if condition is not being excute?
-
what's printed in the serial monitor?jsotola– jsotola2023年01月03日 16:00:14 +00:00Commented Jan 3, 2023 at 16:00
1 Answer 1
That's one of the peculiarities of the C language: the ==
operator compares the string addresses, not their content. It makes sense when you think of them as pointers, but it can be confusing for beginners.
To fix this, you can use strcmp()
like so:
if (strcmp(status,"opened") == 0)
Alternatively, you can change the type of status
to JsonVariant
, like so:
JsonVariant status = doc["status"]
It works with JsonVariant
because I overloaded the ==
operator to support string comparison.
-
if (strcmp(status,"opened") == 0)
You know probably knew this and just forgot, but for the benefit of anyone else,strcmp
returns0
for equality, and some negative and positive numbers for the other relative orderings. So, you'll want the== 0
. Upvote.timemage– timemage2023年01月03日 15:46:45 +00:00Commented Jan 3, 2023 at 15:46 -
Thanks, I updated the answer.Benoit Blanchon– Benoit Blanchon2023年01月03日 16:18:39 +00:00Commented Jan 3, 2023 at 16:18
-
Disclaimer: I appreciate your work on this library. This and your answer are good and helpful. -- However, overloading operators in such a way is one of the many reasons I still dislike C++ after 40+ years of software development in many languages. It hides a lot of things up-front and (mis)leads to weird constructs, making it hard for non-experts to grasp good programming. C++ is therefore not an adequate programming language for beginners.the busybee– the busybee2023年01月04日 07:08:26 +00:00Commented Jan 4, 2023 at 7:08