Home > Blockchain >  Deserialize Json object from mqtt payload using ArduinoJson library
Deserialize Json object from mqtt payload using ArduinoJson library

Time:10-10

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?

CodePudding user response:

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"]);
}

CodePudding user response:

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()
}
  • Related