[英]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.