3

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?

Jess
  • 53
  • 2

1 Answers1

6

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.

Benoit Blanchon
  • 697
  • 3
  • 8
  • `if (strcmp(status,"opened") == 0)` You know probably knew this and just forgot, but for the benefit of anyone else, `strcmp` returns `0` for equality, and some negative and positive numbers for the other relative orderings. So, you'll want the `== 0`. Upvote. – timemage Jan 03 '23 at 15:46
  • Thanks, I updated the answer. – Benoit Blanchon Jan 03 '23 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 Jan 04 '23 at 07:08