簡體   English   中英

如何訪問 AWS IoT 上 MQTT 消息中的嵌套 JSON 元素?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM