0

I'm trying to deserialize a Json object using the ArduinoJson 6 library. The object is passing through a mqtt callback using the PubSubClient library. The payload contains the following example: "{\"action\":\"message\",\"amount\":503}" but I am unable to retrieve the amount value. Only zeros are returned when using the following:

void messageReceived(char *topic, byte *payload, unsigned int length)
{
  DynamicJsonDocument doc(1024);
  deserializeJson(doc, payload, length);
  const int results = doc["amount"];
  Serial.print(results);
}

This works and returns 503 as needed:

DynamicJsonDocument doc(1024);
char json[] = "{\"action\":\"message\",\"amount\":503}";
deserializeJson(doc, json);
const int results = doc["amount"];
Serial.print(results);

I see the results of the payload when I use the following method:

void messageReceived(char *topic, byte *payload, unsigned int length)
{
  for (unsigned int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
}

What is preventing me from being able to parse out the amount value from the first method?

2 Answers 2

1

When programming in C++, it always need to be aware the type of data that you are dealing with. The payload is a byte array, which is not what deserializeJson(doc, payload, length); is expecting, see the function signature of deserializeJson().

void messageReceived(char *topic, byte *payload, unsigned int length)
{
  DynamicJsonDocument doc(128);
  deserializeJson(doc, (char*) payload, length);
  Serial.print(doc["amount"]);
}
Sign up to request clarification or add additional context in comments.

Comments

0

Update & resolution: The first method in my original post worked fine once I fixed the data that was being sent from the Lambda function to the IOT side. (Something I didn't include in my original question and didn't think it was relevant. Turns out it was.) Here is a snippet from the Lambda function that is receiving the data. The issue was that the data was being sent as a string and not parsed. Once I stringified the response and then parsed the output, it worked. Thank you @hcheung for the assistance and helpful info. Your suggestion works as well but only after I fixed the Lambda function.

async function sendToIOT(response) {

const data = JSON.stringify(response);

const iotResponseParams = {
    topic: 'mythingname/subscribe',
    payload: JSON.parse(data)
};

return iotdata.publish(iotResponseParams).promise()
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.