[英]How do I access nested JSON elements in an MQTT message on AWS IoT?
AWS IoT 规则正在接收以下主题为“TempSensors”的 MQTT 有效负载:
{"message": "{\"sensor\":\"12345\",\"timestamp\":\"2020-01-01 16:00:00\",\"value\":\"[-0.5]\",\"unit\":\"[\"deg. C\"]\"}", "sequence": 1234}
我想为“消息”的每个元素提取键值对,以便可以将以下内容传递给 AWS DynamoDB:
{"sensor":"12345","timestamp":"2020-01-01 16:00:00","value": -0.5,"unit": "deg. C"}
我以为我可以使用点符号访问嵌套元素,例如:
SELECT message.sensor AS sensorid FROM 'TempSensors'
但这会导致:
{}
或者也许抓住一切使用;
SELECT (SELECT * from message) AS data FROM 'TempSensors'
这导致:
{"data":[{"$unknown":"{\"sensor\":\"12345\",\"timestamp\":\"2020-01-01 16:00:00\",\"value\":\"[-0.5]\",\"unit\":\"[\"deg. C\"]\"}"}]}
或者:
SELECT (SELECT sensor FROM message) AS sensorid FROM 'TempSensors'
结果是:
{"sensorid":[{}]}
必须有一种简单的方法来提取我完全丢失的 JSON 数据。 我没看到什么?
您收到的有效负载是一个字符串(JSON 对象),您可以使用ArduinoJson
库对其进行反序列化以获取数据。
#include <ArduinoJson.h>
char payload[] = "{\"message\": {\"sensor\":\"12345\",\"timestamp\":\"2020-01-01 16:00:00\",\"value\":[-0.5],\"unit\":[\"deg. C\"]}, \"sequence\": 1234}";
StaticJsonDocument<200> doc; // change memory allocation based on your payload message size
void setup() {
Serial.begin(115200);
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
// get the sensor info from the deserialised object doc
const char *sensor = doc["message"]["sensor"];
double value = doc["message"]["value"][0];
const char *unit = doc["message"]["unit"][0];
Serial.printf("Sensor: %s, value: %.1f %s\n", sensor, value, unit);
}
void loop() {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.